shared_ptr<void> t(new char[num]) 表示内存泄漏?
shared_ptr<void> t(new char[num]) means memory leak?
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_ptr
到std::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有—
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 如何计算Big-O表示法中的平均渐近运行时间
- 我应该如何表示我拥有的连续元素序列?
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 表示类模板C++空类型
- 具有所表示类的相同构造函数签名的代理类模板
- 嵌套在循环中的两个循环的 big-O 表示法
- 具有引用成员的结构是否具有唯一的对象表示形式
- 使用 int 表示浮点除法 C++
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- shared_ptr<void> t(new char[num]) 表示内存泄漏?