C++ 共享\u ptr<;无效>;t(新字符[num])表示内存泄漏? shared_ptr t(新字符[num])

C++ 共享\u ptr<;无效>;t(新字符[num])表示内存泄漏? shared_ptr t(新字符[num]),c++,boost,memory-leaks,shared-ptr,tr1,C++,Boost,Memory Leaks,Shared Ptr,Tr1,意味着内存泄漏 如果是,在这种情况下正确的做法是什么 我应该改用共享_数组吗 我正在手动编辑由“t”指向的字节,以便以后在TCP流中传输。正如我看到的,您在Q中提到的void是一个打字错误,因为在void*上调用delete可以保证标准中未定义的行为 对于另一种数据类型 您必须向共享\u ptr提供自定义删除器,以便调用delete[] 例如: 例如: shared_ptr<void> t(new char[num]) 正如我看到的,您在Q中提到的void是一个输入错误,因为在vo

意味着内存泄漏

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

我应该改用共享_数组吗


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

正如我看到的,您在Q中提到的
void
是一个打字错误,因为在
void*
上调用delete可以保证标准中未定义的行为

对于另一种数据类型

您必须向
共享\u ptr
提供自定义
删除器
,以便调用
delete[]

例如:

例如:

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

正如我看到的,您在Q中提到的
void
是一个输入错误,因为在
void*
上调用delete可以保证标准中未定义的行为

对于另一种数据类型

您必须向
共享\u ptr
提供自定义
删除器
,以便调用
delete[]

例如:

例如:

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

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

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


然后使用结构或联合。

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

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


然后使用一个结构或联合。

我不知道C++11是否有一个共享数组,-你应该使用它。

我不知道C++11是否有一个共享数组,-你应该使用它

意味着内存泄漏

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

如果是,在这种情况下正确的做法是什么。我应该改用共享_数组吗

有两个简单的选择。您可以使用
共享_数组

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

编辑:感谢@Dennis Zickefoose温和地指出了我思维中的一个错误。我的部分答案被改写了

意味着内存泄漏

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

如果是,在这种情况下正确的做法是什么。我应该改用共享_数组吗

有两个简单的选择。您可以使用
共享_数组

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


编辑:感谢@Dennis Zickefoose温和地指出了我思维中的一个错误。我的部分答案被重写了。

我想我知道你从哪里来了-你想要
void*
指针,这样你以后可以将它转换为你要序列化的最终类型。但正如其他人所指出的,您不能删除
void*
指针,也不能删除
shared\u ptr
的代码

因为您正在分配一个字符数组,所以应该是您使用的智能指针类型:

shared_ptr<std::vector<char> > t(new std::vector<char>(num))
(*t)[7] = 42;
shared_数组t(新字符[num]);

将原始字符指针转换为另一种类型应该不会比转换
void*
指针更麻烦。

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

因为您正在分配一个字符数组,所以应该是您使用的智能指针类型:

shared_ptr<std::vector<char> > t(new std::vector<char>(num))
(*t)[7] = 42;
shared_数组t(新字符[num]);

将原始字符指针强制转换为另一种类型应该不会比强制转换
void*
指针更麻烦。

正确的做法是不要将
void
用作共享的\u ptr模板类型。在任何情况下,为什么会导致内存泄漏<代码>共享\u ptr对数组类型有效,不是吗
unique_ptr
确实如此。@VJo:谢谢,但我之所以使用void*是因为我分配了'num'字节来存储不同类型的变量,比如前4个字节表示双字节,后2个字节很短。在指向void的指针上调用delete会导致未定义的行为。不要那样做。请注意,这将调用
运算符delete
,而不是
运算符delete[]
,它是两次未定义的(指针指向void,而不是数组)。这可能会很好地工作,但它很可能会崩溃、泄漏或执行任何其他可能的操作。正确的做法是不要将
void
用作共享ptr的模板类型。在任何情况下,为什么会导致内存泄漏<代码>共享\u ptr对数组类型有效,不是吗
unique_ptr
确实如此。@VJo:谢谢,但我之所以使用void*是因为我分配了'num'字节来存储不同类型的变量,比如前4个字节表示双字节,后2个字节很短。在指向void的指针上调用delete会导致未定义的行为。不要那样做。请注意,这将调用
运算符delete
,而不是
运算符delete[]
,它是两次未定义的(指针指向void,而不是数组)。这可能工作得很好,但很可能会崩溃或泄漏,或者做任何其他可能的事情。这可能应该合并到一个注释中。使用共享\u ptr不是未定义的行为-它的使用也是被鼓励的-这可能应该合并到一个注释中。使用共享\u ptr不是未定义的行为-它的使用也是被鼓励的-仍然是未定义的行为来调用delete[]在void*@Pubby8:请检查我的ans
shared_array<char> t(new char[num]);