何时删除[]指针c++;? 我一直在用C++来研究一段时间,而java是我最困惑的方面之一,就是内存管理。例如,假设我有一个方法,在该方法中我声明了一个指向对象的指针,我想使用get方法将该指针设置为指向另一个对象的属性: SubObject *mySubObject = anotherObject.getSubObject();

何时删除[]指针c++;? 我一直在用C++来研究一段时间,而java是我最困惑的方面之一,就是内存管理。例如,假设我有一个方法,在该方法中我声明了一个指向对象的指针,我想使用get方法将该指针设置为指向另一个对象的属性: SubObject *mySubObject = anotherObject.getSubObject();,c++,memory,pointers,C++,Memory,Pointers,我的问题是,当方法结束时,这个指针会发生什么?我应该在它结束之前使用以下内容吗 delete mySubObject; 如果我不删除它怎么办?它会一直保留到整个程序结束吗 我尝试过Google的C++基本内存管理教程,但我通常会发现更高级的东西,我的头上,任何引用都会被理解。 < P>回答主题中的问题:在C++中,使用Dele[]删除一个分配给新的数组[]。即: int *a = new int[10]; // Allocate 10 ints and save ptr in a. for

我的问题是,当方法结束时,这个指针会发生什么?我应该在它结束之前使用以下内容吗

delete mySubObject;
如果我不删除它怎么办?它会一直保留到整个程序结束吗


<>我尝试过Google的C++基本内存管理教程,但我通常会发现更高级的东西,我的头上,任何引用都会被理解。

< P>回答主题中的问题:在C++中,使用Dele[]删除一个分配给新的数组[]。即:

int *a = new int[10];  // Allocate 10 ints and save ptr in a.
for (int i=0; i<10; i++) {
    a[i] = 0;    // Initialize all elements to zero.
}
delete [] a; // Free memory allocated for the a array.
int*a=新的int[10];//分配10个整数并将ptr保存在a中。
对于(int i=0;i如果该
getSubObject()
方法只返回指向先前分配的mySubObject的指针,您不应该删除它,因为这应该是分配它的类的责任。而且该指针甚至可能没有通过
新的
分配并在堆栈中,因此删除它可能会导致更大的pr问题


根据经验,
delete
您拥有的
new
'd。当然,这在很大程度上取决于编程的布局。

跟踪内存管理可能是一个负担,最好的建议是尽可能避免它,并通过避免原始指针使其显式化。如果您只需要临时访问一个保存在其他地方(在您的示例中,它是另一个对象的成员,因此在那里进行管理)你不应该
删除它,如果你只持有一个
引用而不是一个指针会更好,因为引用明确表明你没有管理该资源。

要回答你文章标题中的问题,你应该使用
删除[]
当且仅当你使用
新[]分配内存时
。您应该使用
delete
当且仅当您使用
new
分配内存时

int *array = new int[10];
int *ptr = new int;
...
delete[] array;
delete ptr;
<> P>回答你的帖子,你应该问问你的代码分配内存的时间。实际上,你应该把内存看作是一个资源,比如文件句柄或者网络连接。在你打开C++或java的文件时,你应该关闭文件。同样,在C++中分配内存的时候,你应该释放它。这个难题是当你应该释放内存时,方法也是

anotherObject.getSubObject();
返回指向新分配对象的指针?释放上述方法中返回的指针指向的内存是谁的任务

如果上述方法使用
new
并返回指向新分配内存的指针,则客户端(调用该方法的程序员)必须
删除
内存。但是,如果方法返回的指针在调用其析构函数时被对象
另一个对象
释放,则客户端不应释放指针引用的内存


如果你是java的C++新手,你应该尽可能的使用,然后检查一下。智能指针的好处是它们提供自动内存管理(你不必担心在你有了<代码>新的< /代码> ED对象之后删除)

< P>当你尝试学习基本的C++内存管理时,忘记所有关于引用和智能指针的答案。
学习基础知识,以后您可以返回这些“高级”主题。

如果不知道有关
getSubObject()
的详细信息,就无法知道如何真正回答这个问题。答案应该在
getSubObject()
的文档中(但不是每个人都应该这样做。)该文档可能位于一些旧式文档、一些doxygen(或类似)页面、声明
getSubObject()
的头文件中。如果出现最坏情况,您需要查看定义
getSubObject()
的源代码,假设源代码可用


在阅读该文档/标题/源代码时,您应该寻找以下问题的答案:“调用方是否必须删除
getSubObject()
分配内存,还是仅返回指向现有对象的指针?”该问题的名称类似于
getSubObject()
我希望后一种情况是这样的。如果函数的名称是
createSubObject()
没有正确的答案,我希望是前者。 如果成员函数(或方法,如果我们使用java行话)返回的指针指向堆栈中分配的对象,则如果在其上使用关键字delete,程序将崩溃

如果您正在使用空闲存储,则调用者或被调用者是否应负责内存管理?如果其他人调用成员函数,现在您有一个悬空指针。如果被调用者正在使用RAII,该怎么办

既然你正在学习(为它而自豪),首先要努力学习内存管理的基础知识。一旦你对内存有了基本的理解,你将更容易适应C++和内存管理。

如果你在做生产代码,你必须在C++中做。避免所有这些问题的最安全的方法是在你需要的时候使用动态内存分配,直到你对它有了更好的理解。在我看来,即使你对动态内存分配有了很好的理解,你也应该有一个很好的理由来说明为什么你要使用它。

祝你好运


阿曼多.< /P> < P> C++中,你必须管理你自己的内存分配,没有垃圾收集的垃圾,你已经忘记清理java/C等任何现代语言了。如果你失去记忆,最好是泄露,最坏的是,

SubObject *mySubObject = anotherObject.getSubObject();
delete mySubObject;