是否可以删除子功能中的对象? 我在C++中内存泄漏问题。

是否可以删除子功能中的对象? 我在C++中内存泄漏问题。,c++,memory-leaks,C++,Memory Leaks,我创建一个对象(新类型)并将其传递给子函数。 我知道我必须删除该对象以避免内存泄漏-但是,当我在子函数中对该对象调用delete时,这会导致应用程序崩溃: void subfunction (TYPE* oldObject,....) { //deep-copy object TYPE* object = new TYPE(oldObject->p1,oldObject->p2,....) subfunction (object,....) delet

我创建一个对象(新类型)并将其传递给子函数。 我知道我必须删除该对象以避免内存泄漏-但是,当我在子函数中对该对象调用delete时,这会导致应用程序崩溃:

void subfunction (TYPE* oldObject,....) {
    //deep-copy object
    TYPE* object = new TYPE(oldObject->p1,oldObject->p2,....)
    subfunction (object,....)
    delete oldObject
}
这里有什么问题?我是否必须在创建对象的同一函数中删除该对象

是否不允许删除函数中的对象,该对象是该函数的参数

编辑:错误消息为
*在“./a.out”中出错:free():无效大小:0x00007fff4fbe59c0*

问题是,您可能在调用子函数(原始调用)之后的原始位置引用了oldObject


干杯。

内存管理的问题是,尽管它基本上相当简单(new/new[]->delete/delete[]),但当程序变得更复杂时,它会变得棘手

这就是为什么第一条建议是避免内存管理。这可以通过声明对象而不是指针以及使用标准库容器来实现

如果需要,可以使用来处理内存管理(在析构函数中清理),尤其是智能指针(std::unique_ptr,std::shared_ptr)

使用(新建/删除)进行内存管理时,在同一范围内分配和释放内存,以便更容易跟踪良好的使用情况

如果确实有必要,可以在其他范围(如函数)中执行删除,但这可能会变得非常难以管理

所以在你问题中的代码中,没有直接指向崩溃的东西,所以它必须与你没有展示的代码结合在一起

这里有什么问题

您可能正在删除同一对象两次。当你到处扔指针,希望某个东西在正确的时间删除它时,很容易做到这一点

我是否必须在创建对象的同一函数中删除该对象

你可以在任何地方删除它(只要你只删除一次)。你不应该这样做,因为杂耍指针几乎不可能确保你只做一次

是否不允许删除函数中的对象,该对象是该函数的参数

你可以;但是你不应该这样做,因为打电话的人会留下一个悬空的指针。如果它试图在对象被删除后对其进行任何处理,那么各种错误都可能随之发生


除非你真的需要,否则不要使用新的;并使用智能指针管理通过
new
创建的所有内容。然后,您可以继续编写有用的代码,而不是调试一堆不稳定的内存损坏。

您显示的几行代码根本不允许诊断问题。正如其他答案和评论所说,这可能是由于删除了一个对象两次,或者可能是删除了一个不是由
new
首先给出的对象。或者可能是其他一些代码正在践踏您的指针,或者偏离分配的对象,并且
delete
最终看到的内容已损坏

C++中有很多事情是你可以做的,但并非全部都是好主意。内存管理也很棘手。您可以将大部分内容留给语言(使用容器、智能指针等),也可以寻找一个垃圾收集附加组件

如果要手动操作,请仔细定义以下几点:

  • 谁负责或创建每种类型的对象?希望有一个简短的清单
  • 允许用户对对象执行什么操作?最好尽可能使它统一
  • 谁负责处理该物品?再一次,希望是一个简短的列表
  • 通过代码确保每个对象在每个可能的路径上创建一次并销毁一次(即,匹配(1)和(3),确保(2)不干预此操作)
  • 仔细考虑每一段代码,其中有多个指向同一对象的指针。他们中的哪一个“拥有”了这个对象,如果需要的话,“所有权”是从一个干净地移交给下一个吗?这和上面的(1)和(3)吻合吗?如果传递了指向同一对象的多个不同指针,是否会混淆(2)中的某些内容
  • 如果可能的话,在所有对象类型中设置通用规则(必须记住不同的规则,这将保证最终应用错误的规则,并因此获得烟花效果)。上面给出了一些简单的规则(例如,相同范围内的new/delete;确保
    new
    仅在构造函数中调用,
    delete
    仅在另一个析构函数中调用),但它们可能限制太多(堆上的对象和指针非常棒,因为对象的生命周期不必与代码匹配)

    考虑使用内存分配跟踪/调试工具,如valgrind。但不要依赖于它们,找到一个混乱并清理它要比事先计划的工作多得多。而且你可能不会在测试中注意到混乱,而墨菲定律保证它会在最坏的时候崩溃或出现其他不正常的行为。

    我是最糟糕的开线器; 不幸的是,我的系统崩溃了,我还没有为登录存储垃圾邮件地址,因此我现在只能作为新用户回答

    vonbrand实际上给出了正确的提示

    
    c型;
    类型*cp=&c;


    这样的元素是如何删除的?可能是在其作用域的末尾自动删除的,这导致了第二次删除操作,从而导致了我的问题。

    我在子函数调用之前复制了该对象-因此每个子函数都有自己的旧对象,该对象在其中被删除。我没有看到任何更改,即一个对象被删除两次。@user3355815:我想这可能会成为并发程序中的一个问题,不是吗?(我的程序还没有并发,但它计划成为并发的)我创建了一个数据结构(对象)的副本