【问题标题】:Heap crash when overloading new and delete [duplicate]重载new和delete时堆崩溃[重复]
【发布时间】: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


【解决方案1】:

您使用new int[size]series 分配为一个数组。所以你必须把它释放为一个:delete [] n->series

(我不知道为什么要在那里进行演员表,但这是个坏主意。如果你告诉编译器忽略你的错误,只会让事情变得更难。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2013-03-12
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多