是否可以删除子功能中的对象

Is it possible to delete objects in a subfunction?

本文关键字:对象 功能 删除 是否      更新时间:2023-10-16

我在C++中遇到内存泄漏问题。

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

void subfunction (TYPE* oldObject,....) {
//deep-copy object
TYPE* object = new TYPE(oldObject->p1,oldObject->p2,....)
subfunction (object,....)
delete oldObject
}

这里有什么问题?我必须在创建对象的同一函数中删除对象吗?

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

EDIT:错误消息为'*中有错误`/a.out":free():无效大小:0x00007fff4fbe59c0*'

这里有什么问题?

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

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

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

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

您可以;但你不应该这样做,因为调用者会留下一个悬空的指针。如果它在对象被删除后试图对它做任何事情,那么各种各样的错误都可能随之而来。

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

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

干杯。

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

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

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

当使用(new/delete)进行内存管理时,在同一范围内分配和释放内存,这样更容易跟踪良好的使用情况。

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

因此,在您问题中的代码中,没有任何内容直接指向崩溃,因此它必须与您没有显示的代码结合在一起。

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

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

如果你想手工完成,请仔细定义以下几点:

  1. 谁负责或创建每种类型的对象?希望是一个简短的列表
  2. 允许用户对对象执行什么操作?最好尽可能统一
  3. 谁负责处理这个物体?再次,希望是一个简短的列表
  4. 确保通过代码在每个可能的路径上创建一次并销毁一次每个对象(即,匹配(1)和(3),确保(2)不会干扰这一点)
  5. 仔细考虑每一段代码,其中有多个指向同一对象的指针。他们中的哪一个"拥有"这个物体,如果需要的话,"权力"是否会从一个干净地移交给另一个?这与上面的(1)和(3)相吻合吗?如果传递了指向同一对象的几个不同指针,会不会混淆(2)中的一些

如果可能的话,在所有对象类型中设置通用规则(必须记住不同的规则,这保证了你最终会应用错误的规则,并因此而获得焰火效果)。上面给出了一些简单的规则(例如,在相同的范围内新建/删除;确保new只在构造函数中调用,delete只在析构函数中调用),但它们可能限制性太强(堆上的对象和指针非常好,正是因为对象的生存期不必与代码匹配)。

考虑使用内存分配跟踪/调试工具,如valgrind。但不依赖他们,发现并清理混乱比事先计划要多得多。你可能不会注意到你的测试中出现了混乱,而墨菲定律向你保证,它会在最糟糕的时候崩溃或表现失常。

我是线程开启器;遗憾的是,我的系统崩溃了,我没有存储登录的垃圾邮件地址,因此我现在只能作为新用户回答

冯布兰德实际上给出了正确的提示。第一个对象被初始化为默认值

TYPE c; TYPE* cp =&c;

这样的元素是如何被删除的?可能是在它的作用域结束时自动执行的,这导致了第二次删除操作,从而导致了我的问题。