shared_ptr<void> t(new char[num]) 表示内存泄漏?


shared_ptr<void> t(new char[num])

表示内存泄漏?

如果是,在这种情况下,正确的做法是什么?

我应该用shared_array<>代替吗?

我正在手动编辑't'指向的字节,以便稍后在TCP流中传输。

表示内存泄漏?

不,它的意思是未定义行为。(它可能有任何症状,包括内存泄漏。)呼叫delete必须与呼叫new匹配。你不喜欢。你用new[]分配,用delete破坏。

如果是,在这种情况下正确的做法是什么?我应该使用shared_array<>来代替吗?

有两个简单的选择。你可以使用shared_array:

shared_array<char> t(new char[num])
t[7] = 42;

或者,您可以使用shared_ptrstd::vector:

shared_ptr<std::vector<char> > t(new std::vector<char>(num))
(*t)[7] = 42;


编辑:感谢@Dennis Zickefoose温柔地指出我思维中的一个错误。

我看到你在Q中提到的void是一个错别字,因为在void *上调用delete被标准保证为未定义行为。

对于其他数据类型,

您必须将您的自定义deletor提供给shared_ptr,以便您可以调用delete []

,

例如:

template<typename T>
struct Customdeleter
{
   void operator()(T* p)
   {
      delete [] p;
   }
};

和调用as:

shared_ptr<char> sp(new char[num], Customdeleter<char>());

编辑:
既然你澄清了在评论中使用Boost而不是TR1(AFAIK TR1没有shared_array)

可以使用shared_array:

shared_array<char> sp(new char[num])

我想我知道你是从哪里来的-你想要void *指针,这样你就可以稍后将其转换为你序列化的最终类型。但是正如其他人指出的那样,你不能删除void*指针,shared_ptr的代码也不能。

由于你正在分配一个char数组,它应该是你使用的智能指针的类型:

shared_array<char> t(new char[num]);

将原始char指针转换为另一种类型应该不会比转换void*指针更成问题。

你在void*上调用delete,这是未定义的行为。

我使用void*的原因是因为我分配'num'字节用于存储不同类型的变量,比如前4个字节代表双精度,接下来的2个字节是短的。

我不知道c++ 11是否有shared_array,但Boost有—

最新更新