指向 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 一个被 malloced 的指针。

_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*

看看what make_shared does

它将尝试构造一个 T 类型的对象,将您提供的参数发送给构造函数。

在你的代码中,它会尝试创建一个新的 void*对象(传递mallocs retunr指针作为参数),我相信你不想做。

相反,如果您使用 shared_pointer 的对象构造函数描述 here on 3-7

Constructs a shared_ptr with ptr as the pointer to the managed object.

我认为你想做的