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

时间:2011-10-24 19:27:49

标签: c++ boost memory-leaks shared-ptr tr1

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

意味着内存泄漏?

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

我应该使用shared_array&lt;&gt;代替?

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

5 个答案:

答案 0 :(得分:3)

正如我看到void你在Q中提到的是一个拼写错误,因为void *上的Calling delete被标准保证为未定义的行为。

对于其他数据类型,

您必须向deletor提供自定义shared_ptr,以便致电delete []

例如:

例如:

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

并调用:

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

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

您可以使用shared_array

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

答案 1 :(得分:3)

  

意味着内存泄漏?

不,这意味着未定义的行为。 (可能有任何症状,包括内存泄漏。)对delete的呼叫必须与new的呼叫匹配。你的没有。您使用new[]进行分配,但使用delete进行销毁。

  

如果是这样,在这种情况下,正确的做法是什么。我应该使用shared_array&lt;&gt;代替?

有两个简单的选择。您可以使用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轻轻指出我的想法中的错误。我的部分答案都会被重写。

答案 2 :(得分:1)

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

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

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

将原始字符指针强制转换为另一种类型不应该是一个问题,而不是强制转换void*指针。

答案 3 :(得分:0)

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

  

我使用void *的原因是因为我正在分配'num'字节来存储不同类型的变量,比如前4个字节代表一个double,接下来的2个字节很短..

然后使用结构或联合。

答案 4 :(得分:0)

我不知道C ++ 11是否有shared_array,but Boost does - 你应该使用它。