Unique_ptr C++用法

因为我不太熟悉C++ RAII特性。我从来没有用过。无论如何,我开始研究它(我在“内核恐慌”)。编译模块,我有以下错误:Unique_ptr C++用法

In file included from /usr/include/c++/6/memory:81:0, 

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h: In instantiation of ‘void std::unique_ptr<_Tp [], _Dp>::reset(_Up) [with _Up = char*; <template-parameter-2-2> = void; _Tp = const char; _Dp = std::default_delete<const char []>]’:

/usr/include/c++/6/bits/unique_ptr.h:539:9: required from ‘typename std::enable_if<std::__and_<std::__and_<std::is_array<_Up>, std::is_same<typename std::unique_ptr<_Tp [], _Dp>::_Pointer::type, _Tp*>, std::is_same<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Up, _Ep>::element_type*>, std::is_convertible<typename std::unique_ptr<_Up, _Ep>::element_type (*)[], _Tp (*)[]>, std::__or_<std::__and_<std::is_reference<_Dp>, std::is_same<_T2, _U2> >, std::__and_<std::__not_<std::is_reference<_Dp> >, std::is_convertible<_Ep, _Dp> > > >, std::is_assignable<_T2&, _U2&&> >::value, std::unique_ptr<_Tp [], _Dp>&>::type std::unique_ptr<_Tp [], _Dp>::operator=(std::unique_ptr<_Up, _Ep>&&) [with _Up = char []; _Ep = std::default_delete<char []>; _Tp = const char; _Dp = std::default_delete<const char []>; typename std::enable_if<std::__and_<std::__and_<std::is_array<_Up>, std::is_same<typename std::unique_ptr<_Tp [], _Dp>::_Pointer::type, _Tp*>, std::is_same<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Up, _Ep>::element_type*>, std::is_convertible<typename std::unique_ptr<_Up, _Ep>::element_type (*)[], _Tp (*)[]>, std::__or_<std::__and_<std::is_reference<_Dp>, std::is_same<_T2, _U2> >, std::__and_<std::__not_<std::is_reference<_Dp> >, std::is_convertible<_Ep, _Dp> > > >, std::is_assignable<_T2&, _U2&&> >::value, std::unique_ptr<_Tp [], _Dp>&>::type = std::unique_ptr<const char []>&]’

java/rocksjni/compaction_filter_factory_jnicallback.cc:33:58: required from here

/usr/include/c++/6/bits/unique_ptr.h:614:6: error: no matching function for call to ‘swap(const char*&, char*&)’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/bits/stl_pair.h:59:0,

from /usr/include/c++/6/bits/stl_algobase.h:64,

from /usr/include/c++/6/memory:62,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/move.h:179:5: note: candidate: template<class _Tp> typename std::enable_if<std::__and_<std::is_move_constructible<_Tp>, std::is_move_assignable<_Tp> >::value>::type std::swap(_Tp&, _Tp&)

swap(_Tp& __a, _Tp& __b)

^~~~

/usr/include/c++/6/bits/move.h:179:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: deduced conflicting types for parameter ‘_Tp’ (‘const char*’ and ‘char*’)

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/bits/stl_pair.h:59:0,

from /usr/include/c++/6/bits/stl_algobase.h:64,

from /usr/include/c++/6/memory:62,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/move.h:202:5: note: candidate: template<class _Tp, long unsigned int _Nm> typename std::enable_if<std::__is_swappable<_Tp>::value>::type std::swap(_Tp (&)[_Nm], _Tp (&)[_Nm])

swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])

^~~~

/usr/include/c++/6/bits/move.h:202:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘_Tp [_Nm]’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/bits/stl_algobase.h:64:0,

from /usr/include/c++/6/memory:62,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/stl_pair.h:471:5: note: candidate: template<class _T1, class _T2> void std::swap(std::pair<_T1, _T2>&, std::pair<_T1, _T2>&)

swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)

^~~~

/usr/include/c++/6/bits/stl_pair.h:471:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::pair<_T1, _T2>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/string:52:0,

from /usr/include/c++/6/stdexcept:39,

from /usr/include/c++/6/array:39,

from /usr/include/c++/6/tuple:39,

from /usr/include/c++/6/functional:55,

from /usr/include/c++/6/memory:79,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/basic_string.h:5287:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> void std::swap(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)

swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,

^~~~

/usr/include/c++/6/bits/basic_string.h:5287:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/tuple:39:0,

from /usr/include/c++/6/functional:55,

from /usr/include/c++/6/memory:79,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/array:275:5: note: candidate: template<class _Tp, long unsigned int _Nm> void std::swap(std::array<_Tp, _Nm>&, std::array<_Tp, _Nm>&)

swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two)

^~~~

/usr/include/c++/6/array:275:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::array<_Tp, _Nm>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/functional:55:0,

from /usr/include/c++/6/memory:79,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/tuple:1546:5: note: candidate: template<class ... _Elements> void std::swap(std::tuple<_Elements ...>&, std::tuple<_Elements ...>&)

swap(tuple<_Elements...>& __x, tuple<_Elements...>& __y)

^~~~

/usr/include/c++/6/tuple:1546:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::tuple<_Elements ...>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/memory:79:0,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/functional:2238:5: note: candidate: template<class _Res, class ... _Args> void std::swap(std::function<_Res(_ArgTypes ...)>&, std::function<_Res(_ArgTypes ...)>&)

swap(function<_Res(_Args...)>& __x, function<_Res(_Args...)>& __y)

^~~~

/usr/include/c++/6/functional:2238:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/compaction_filter_factory_jnicallback.h:13,

from java/rocksjni/compaction_filter_factory_jnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::function<_Res(_ArgTypes ...)>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h: In instantiation of ‘void std::unique_ptr<_Tp [], _Dp>::reset(_Up) [with _Up = char*; <template-parameter-2-2> = void; _Tp = const char; _Dp = std::default_delete<const char []>]’:

/usr/include/c++/6/bits/unique_ptr.h:539:9: required from ‘typename std::enable_if<std::__and_<std::__and_<std::is_array<_Up>, std::is_same<typename std::unique_ptr<_Tp [], _Dp>::_Pointer::type, _Tp*>, std::is_same<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Up, _Ep>::element_type*>, std::is_convertible<typename std::unique_ptr<_Up, _Ep>::element_type (*)[], _Tp (*)[]>, std::__or_<std::__and_<std::is_reference<_Dp>, std::is_same<_T2, _U2> >, std::__and_<std::__not_<std::is_reference<_Dp> >, std::is_convertible<_Ep, _Dp> > > >, std::is_assignable<_T2&, _U2&&> >::value, std::unique_ptr<_Tp [], _Dp>&>::type std::unique_ptr<_Tp [], _Dp>::operator=(std::unique_ptr<_Up, _Ep>&&) [with _Up = char []; _Ep = std::default_delete<char []>; _Tp = const char; _Dp = std::default_delete<const char []>; typename std::enable_if<std::__and_<std::__and_<std::is_array<_Up>, std::is_same<typename std::unique_ptr<_Tp [], _Dp>::_Pointer::type, _Tp*>, std::is_same<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Up, _Ep>::element_type*>, std::is_convertible<typename std::unique_ptr<_Up, _Ep>::element_type (*)[], _Tp (*)[]>, std::__or_<std::__and_<std::is_reference<_Dp>, std::is_same<_T2, _U2> >, std::__and_<std::__not_<std::is_reference<_Dp> >, std::is_convertible<_Ep, _Dp> > > >, std::is_assignable<_T2&, _U2&&> >::value, std::unique_ptr<_Tp [], _Dp>&>::type = std::unique_ptr<const char []>&]’

java/rocksjni/comparatorjnicallback.cc:34:21: required from here

/usr/include/c++/6/bits/unique_ptr.h:614:6: error: no matching function for call to ‘swap(const char*&, char*&)’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/bits/stl_pair.h:59:0,

from /usr/include/c++/6/bits/stl_algobase.h:64,

from /usr/include/c++/6/memory:62,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/move.h:179:5: note: candidate: template<class _Tp> typename std::enable_if<std::__and_<std::is_move_constructible<_Tp>, std::is_move_assignable<_Tp> >::value>::type std::swap(_Tp&, _Tp&)

swap(_Tp& __a, _Tp& __b)

^~~~

/usr/include/c++/6/bits/move.h:179:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: deduced conflicting types for parameter ‘_Tp’ (‘const char*’ and ‘char*’)

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/bits/stl_pair.h:59:0,

from /usr/include/c++/6/bits/stl_algobase.h:64,

from /usr/include/c++/6/memory:62,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/move.h:202:5: note: candidate: template<class _Tp, long unsigned int _Nm> typename std::enable_if<std::__is_swappable<_Tp>::value>::type std::swap(_Tp (&)[_Nm], _Tp (&)[_Nm])

swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])

^~~~

/usr/include/c++/6/bits/move.h:202:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘_Tp [_Nm]’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/bits/stl_algobase.h:64:0,

from /usr/include/c++/6/memory:62,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/stl_pair.h:471:5: note: candidate: template<class _T1, class _T2> void std::swap(std::pair<_T1, _T2>&, std::pair<_T1, _T2>&)

swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)

^~~~

/usr/include/c++/6/bits/stl_pair.h:471:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::pair<_T1, _T2>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/string:52:0,

from /usr/include/c++/6/stdexcept:39,

from /usr/include/c++/6/array:39,

from /usr/include/c++/6/tuple:39,

from /usr/include/c++/6/functional:55,

from /usr/include/c++/6/memory:79,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/basic_string.h:5287:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> void std::swap(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)

swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,

^~~~

/usr/include/c++/6/bits/basic_string.h:5287:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/tuple:39:0,

from /usr/include/c++/6/functional:55,

from /usr/include/c++/6/memory:79,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/array:275:5: note: candidate: template<class _Tp, long unsigned int _Nm> void std::swap(std::array<_Tp, _Nm>&, std::array<_Tp, _Nm>&)

swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two)

^~~~

/usr/include/c++/6/array:275:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::array<_Tp, _Nm>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/functional:55:0,

from /usr/include/c++/6/memory:79,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/tuple:1546:5: note: candidate: template<class ... _Elements> void std::swap(std::tuple<_Elements ...>&, std::tuple<_Elements ...>&)

swap(tuple<_Elements...>& __x, tuple<_Elements...>& __y)

^~~~

/usr/include/c++/6/tuple:1546:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::tuple<_Elements ...>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

~~~~^~~~~~~~~~~~~~~~~~~~~~~~

In file included from /usr/include/c++/6/memory:79:0,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/functional:2238:5: note: candidate: template<class _Res, class ... _Args> void std::swap(std::function<_Res(_ArgTypes ...)>&, std::function<_Res(_ArgTypes ...)>&)

swap(function<_Res(_Args...)>& __x, function<_Res(_Args...)>& __y)

^~~~

/usr/include/c++/6/functional:2238:5: note: template argument deduction/substitution failed:

In file included from /usr/include/c++/6/memory:81:0,

from ./java/./rocksjni/comparatorjnicallback.h:13,

from java/rocksjni/comparatorjnicallback.cc:9:

/usr/include/c++/6/bits/unique_ptr.h:614:6: note: mismatched types ‘std::function<_Res(_ArgTypes ...)>’ and ‘std::__tuple_element_t<0ul, std::tuple<const char*, std::default_delete<const char []> > > {aka const char*}’

swap(std::get<0>(_M_t), __p);

我不是一定要了解该堆栈跟踪,但它接缝有在的unique_ptr不匹配。也许const char *和char *。

类哪里有错误是:

CompactionFilterFactoryJniCallback::CompactionFilterFactoryJniCallback(

JNIEnv* env, jobject jcompaction_filter_factory)

: JniCallback(env, jcompaction_filter_factory) {

// Note: The name of a CompactionFilterFactory will not change during

// it's lifetime, so we cache it in a global var

jmethodID jname_method_id =

AbstractCompactionFilterFactoryJni::getNameMethodId(env);

if(jname_method_id == nullptr) {

// exception thrown: NoSuchMethodException or OutOfMemoryError

return;

}

jstring jname =

(jstring)env->CallObjectMethod(m_jcallback_obj, jname_method_id);

if(env->ExceptionCheck()) {

// exception thrown

return;

}

jboolean has_exception = JNI_FALSE;

// line 33

m_name = JniUtil::copyString(env, jname, &has_exception); // also releases jname

if (has_exception == JNI_TRUE) {

// exception thrown

return;

}

m_jcreate_compaction_filter_methodid =

AbstractCompactionFilterFactoryJni::getCreateCompactionFilterMethodId(env);

if(m_jcreate_compaction_filter_methodid == nullptr) {

// exception thrown: NoSuchMethodException or OutOfMemoryError

return;

}

}

const char* CompactionFilterFactoryJniCallback::Name() const {

return m_name.get();

}

std::unique_ptr<CompactionFilter> CompactionFilterFactoryJniCallback::CreateCompactionFilter(

const CompactionFilter::Context& context) {

jboolean attached_thread = JNI_FALSE;

JNIEnv* env = getJniEnv(&attached_thread);

assert(env != nullptr);

jlong addr_compaction_filter = env->CallLongMethod(m_jcallback_obj,

m_jcreate_compaction_filter_methodid,

static_cast<jboolean>(context.is_full_compaction),

static_cast<jboolean>(context.is_manual_compaction));

if(env->ExceptionCheck()) {

// exception thrown from CallLongMethod

env->ExceptionDescribe(); // print out exception to stderr

releaseJniEnv(attached_thread);

return nullptr;

}

auto* const cff = reinterpret_cast<CompactionFilter*>(addr_compaction_filter);

releaseJniEnv(attached_thread);

return std::unique_ptr<CompactionFilter>(cff);

}

目前尚不清楚如何阅读堆栈跟踪识别问题。我希望收到一些建议,了解如何解决问题并阅读堆栈跟踪。

回答:

错误说你有,你尝试调用函数reset传递char*作为参数std::unique_ptr<char const[]>对象。

好了,这样的说法必须char const*为编译,您可以用const_cast实现,如:

std::unique_ptr<char const[]> p; 

char* q = new char[1]{};

p.reset(const_cast<char const*>(q));


貌似JniUtil::copyString回报std::unique_ptr<char[]>,你把它分配给std::unique_ptr<char const[]>导致错误。

一种修复方法是将m_name的类型更改为std::unique_ptr<char[]>

另一种是手动添加常量性(增加常量性是安全的,是一个隐式转换,但这里需要选择的std::unique_ptr<>::reset正确的过载):

m_name.reset(const_cast<char const*>(JniUtil::copyString(...).release())); 

以上是 Unique_ptr C++用法 的全部内容, 来源链接: utcz.com/qa/266481.html

回到顶部