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]);