C++ delete[] on new char;
C++ delete[] on new char;
考虑以下代码:
int main()
{
char* str = new char;
str[0] = 'a';
delete[] str; //Notice the []
}
它编译,运行,没有崩溃(VC15和g++)但是,它确实有1个内存泄漏,我可以清楚地看到与valgrind。
如果我运行下面的代码:#include <iostream>
class Foo{
public:
Foo(){
std::cout << "Foo::Foo" << std::endl;
}
~Foo(){
std::cout << "Foo::~Foo" << std::endl;
}
};
int main()
{
Foo* foo = new Foo;
delete[] foo;
return 0;
}
在Windows上运行时,我得到一个析构函数调用的无限循环,并且在Linux中出现一个无效的指针错误(在~20 d'tors调用之后)。
我不明白的是为什么这两者之间有区别?为什么我没有得到一个无限循环与new char
或崩溃?
您应该将delete[]
与且仅与使用new[]
分配的指针一起使用;
在第一个代码片段中:
- 使用
char* str = new char;
语句,您可以获得指向单个字符的指针。所以来自new的类型匹配char*
。 - 但是你的
delete[]
期望一个指向char数组的指针,所以当你删除一些不是数组的东西时,你会得到未定义行为(UB)
第二个代码片段有完全相同的问题。UB是未定义的,可以给出奇怪和无法解释的结果。
如何解决
为单个元素分配使用单个元素delete:
Foo* foo = new Foo;
delete foo;
或者使用数组delete来分配数组:
Foo* foo = new Foo[1];
delete[] foo;
或者更好:去掉你想要使用的new/delete,用vector代替数组。
简而言之,对于没有分配new[]
且不是null
的指针调用delete[]
总是undefined
我引用自cppreference.com:
由delete[]-表达式调用,释放先前为对象数组分配的存储空间。行为的标准该函数的标准库实现是未定义的,除非ptr是null指针或先前从标准中获得的指针operator new或operator的库实现新[](size_t, std:: nothrow_t)。
相关文章:
- 为char数组调整zlib-zpipe
- char array[sizeof(Message)]; vs char* array = new char[sizeo
- 正在使用new char[]或malloc的结果来铸造float*是UB(严格的混叠冲突)
- 正确的语法以对 char* 数组使用 new
- "char *"和"char * = new char[]"之间的C++区别
- 分配给“char* x = new char[32]”的内存过多
- Heap corruption after new char[strlen
- 可能的内存泄漏:new char[strlen()]
- 如何在char*func()中正确删除用new[]分配的char数组
- 在动态分配中,在关键字new之前使用Why(unsigned char*)
- 为什么我不能用c = new (char*)[10]初始化char** c,而c = new char*[10]是可以的
- C++ delete[] on new char;
- 将字符串存储为char[],位置为new,并将其取回
- 操作符new(n)与new unsigned char[n]的位置new
- shared_ptr<void> t(new char[num]) 表示内存泄漏?
- New和delete char*会导致异常
- 当重载new操作符时,它不会为char指针分配内存
- "new char[]"是否需要手动释放资源?
- 当每个字符串由"new char[]"创建时,如何对"vector<string>"的元素调用"delete"?
- 为什么 ptrVec = new vector<const char*> 编译失败