为什么 delete[] 会导致这个测试程序崩溃
Why does delete[] crash this test program
我声明了一个新的指针数组。 我的问题是:为什么删除delete[]
的数组会导致程序崩溃?示例代码:
#include <iostream>
using namespace std;
typedef unsigned int uint32;
struct demon{
private:
static uint32 next_id;
public:
uint32 id;
demon(){
id = demon::next_id;
demon::next_id++;
}
};
uint32 demon::next_id = 1;
int main(){
demon** demons = new demon*[5];
demon d1;
demon d2;
demon d3;
demon d4;
demon d5;
demons[1] = &d1;
demons[2] = &d2;
demons[3] = &d3;
demons[4] = &d4;
demons[5] = &d5;
cout << demons[1]->id << endl;
cout << demons[2]->id << endl;
cout << demons[3]->id << endl;
cout << demons[4]->id << endl;
cout << demons[5]->id << endl;
delete[] demons; // without this, the code works
return 0;
}
*** Error in `./test': free(): invalid next size (fast): 0x0000000000e68c20 ***
Aborted
我在没有删除的情况下也测试了内存泄漏,程序会出现段错误。
In C++ containers (arrays/vectors) use zero-based numbering. 你应该使用:
demons[0] = &d1;
demons[1] = &d2;
demons[2] = &d3;
demons[3] = &d4;
demons[4] = &d5;
就像现在一样,您正在写入未分配的内存区域。这是极其复杂的错误场景的常见来源,因此您应该熟悉 valgrind.
我声明了一个新的指针数组。 我的问题是:为什么删除delete[]
的数组会导致程序崩溃?示例代码:
#include <iostream>
using namespace std;
typedef unsigned int uint32;
struct demon{
private:
static uint32 next_id;
public:
uint32 id;
demon(){
id = demon::next_id;
demon::next_id++;
}
};
uint32 demon::next_id = 1;
int main(){
demon** demons = new demon*[5];
demon d1;
demon d2;
demon d3;
demon d4;
demon d5;
demons[1] = &d1;
demons[2] = &d2;
demons[3] = &d3;
demons[4] = &d4;
demons[5] = &d5;
cout << demons[1]->id << endl;
cout << demons[2]->id << endl;
cout << demons[3]->id << endl;
cout << demons[4]->id << endl;
cout << demons[5]->id << endl;
delete[] demons; // without this, the code works
return 0;
}
*** Error in `./test': free(): invalid next size (fast): 0x0000000000e68c20 ***
Aborted
我在没有删除的情况下也测试了内存泄漏,程序会出现段错误。
In C++ containers (arrays/vectors) use zero-based numbering. 你应该使用:
demons[0] = &d1;
demons[1] = &d2;
demons[2] = &d3;
demons[3] = &d4;
demons[4] = &d5;
就像现在一样,您正在写入未分配的内存区域。这是极其复杂的错误场景的常见来源,因此您应该熟悉 valgrind.