指向 shared_ptr 错误的原始指针
Raw pointer to shared_ptr bug
我正在开发图像处理应用程序。
总而言之,我有一个存储图像数据的字节缓冲区,所以我可以使用这个数组在 wx 小部件和 OpenCV 中轻松处理图像。我计划将此字节缓冲区存储在 shared_ptr 中,因为它将在执行过程中用于相同 class 的其他实例。
使用原始指针它工作正常,但每当我尝试使用 shared_ptr 每当将此指针传递给函数时我都会遇到分段错误。
如何在没有分段错误的情况下将它传递给这个函数?崩溃对我来说毫无意义
错误在这里
_dataSize = (size_t)len;
_originalData = std::make_shared<void*>(malloc(_dataSize));
if ( file.Read(_originalData.get(), _dataSize) != len )
在上面代码的最后一行,我试图将 _original 数据指针传递给 Read 函数
这是 full code,在上面的文章中,我只是写了错误发生的那一行。完整的代码错误在 src/Img.cpp 文件第 18
行
谢谢
_originalData.get()
是 void**
,不是 void*
。
要分享该分配的所有权,您需要 std::shared_ptr<void>
,而不是 std::shared_ptr<void*>
。您还需要设置解除分配函数,因为它是未定义的行为 delete
一个被 malloc
ed 的指针。
_originalData = std::shared_ptr<void>{ malloc(len), free }; // _originalData is a `std::shared_ptr<void>
if ( file.Read(_originalData.get(), len) != len )
或者,从 C++20 开始,您可以使用 std::shared_ptr<char[]>
,而根本不使用 malloc
。
_originalData = std::make_shared_for_overwrite<char[]>{ len }; // _originalData is a `std::shared_ptr<char[]>
if ( file.Read(*_originalData, len) != len ) // implicit conversion of char* to void*
它将尝试构造一个 T
类型的对象,将您提供的参数发送给构造函数。
在你的代码中,它会尝试创建一个新的 void*
对象(传递malloc
s retunr指针作为参数),我相信你不想做。
相反,如果您使用 shared_pointer
的对象构造函数描述 here on 3-7 它
Constructs a shared_ptr with ptr as the pointer to the managed object.
我认为你想做的
我正在开发图像处理应用程序。
总而言之,我有一个存储图像数据的字节缓冲区,所以我可以使用这个数组在 wx 小部件和 OpenCV 中轻松处理图像。我计划将此字节缓冲区存储在 shared_ptr 中,因为它将在执行过程中用于相同 class 的其他实例。
使用原始指针它工作正常,但每当我尝试使用 shared_ptr 每当将此指针传递给函数时我都会遇到分段错误。
如何在没有分段错误的情况下将它传递给这个函数?崩溃对我来说毫无意义
错误在这里
_dataSize = (size_t)len;
_originalData = std::make_shared<void*>(malloc(_dataSize));
if ( file.Read(_originalData.get(), _dataSize) != len )
在上面代码的最后一行,我试图将 _original 数据指针传递给 Read 函数
这是 full code,在上面的文章中,我只是写了错误发生的那一行。完整的代码错误在 src/Img.cpp 文件第 18
行谢谢
_originalData.get()
是 void**
,不是 void*
。
要分享该分配的所有权,您需要 std::shared_ptr<void>
,而不是 std::shared_ptr<void*>
。您还需要设置解除分配函数,因为它是未定义的行为 delete
一个被 malloc
ed 的指针。
_originalData = std::shared_ptr<void>{ malloc(len), free }; // _originalData is a `std::shared_ptr<void>
if ( file.Read(_originalData.get(), len) != len )
或者,从 C++20 开始,您可以使用 std::shared_ptr<char[]>
,而根本不使用 malloc
。
_originalData = std::make_shared_for_overwrite<char[]>{ len }; // _originalData is a `std::shared_ptr<char[]>
if ( file.Read(*_originalData, len) != len ) // implicit conversion of char* to void*
它将尝试构造一个 T
类型的对象,将您提供的参数发送给构造函数。
在你的代码中,它会尝试创建一个新的 void*
对象(传递malloc
s retunr指针作为参数),我相信你不想做。
相反,如果您使用 shared_pointer
的对象构造函数描述 here on 3-7 它
Constructs a shared_ptr with ptr as the pointer to the managed object.
我认为你想做的