【发布时间】:2016-09-02 15:28:09
【问题描述】:
我在重载删除的删除调用中遇到堆崩溃。请帮我解决这个问题。
class number {
int *series;
public:
void* operator new(size_t size){
number *n = ::new number;
n->series = new int[size];
printf("new %p %p\n", n, n->series);
return n;
}
void operator delete(void *ptr) {
number *n = (number*)ptr;
printf("delete %p %p\n", n, n->series);
delete (int*)n->series;// why crash here?
::delete n;
}
};
int main() {
number *n= new number;
delete n;
return 0;
}
【问题讨论】:
-
delete (int*)n->series;必须是delete [] n->series; -
只是出于好奇,为什么不将系列初始化委托给构造函数?
-
另外,在您的情况下使用自定义运算符 new 和 delete 有点奇怪。这不是一个好的代码。您应该改用构造函数和析构函数。这将允许您在没有
new的情况下创建新对象,这在这种情况下更快并且可能更好。 -
@NicolBolas 基于那个元线程,我很高兴你发现了这个重复!我找了一会儿就放弃了。
标签: c++ overloading new-operator operator-keyword