shared_ptr<void> t(new char[num])
意味着内存泄漏?
如果是这样,在这种情况下,正确的做法是什么。
我应该使用shared_array&lt;&gt;代替?
我正在手动编辑't'指向的字节,以便以后在TCP Stream中传输。
答案 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_ptr
到std::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 - 你应该使用它。