使用析构函数仅删除动态分配的数组还是删除所有数组?

时间:2018-12-05 15:47:55

标签: c++ arrays dynamic-memory-allocation

我是C ++的新手,所以我在内存管理方面苦苦挣扎。 我知道,当我们有一个指向数组的指针时,这意味着它是动态创建的,因此以后我应该在析构函数中将其删除。但是,如果我们有一个普通数组,我也需要在该普通数组的析构函数中包含一条delete语句吗?还是程序会自动执行此操作? 例如,我有一个像这样的普通数组 const path = require('path'); var webpack = require('webpack'); module.exports = { mode:'development', entry: './public/app/app.js', output: { path: path.join(__dirname, 'public'), filename: '[name].js', chunkFilename: "[name].[chunkhash].js" }, watch:true }; 在我的析构函数中,我应该包括以下内容: int myArray[]; ? 预先感谢,

4 个答案:

答案 0 :(得分:1)

  

但是,如果我们有一个普通数组怎么办,我是否也需要在析构函数中为此普通数组包含一条delete语句?还是程序会自动执行此操作?例如,我有一个像这样的int myArray[];这样的普通数组,并且在我的析构函数中,我应该包括这样的内容:delete[] myArray;吗?

不。如果您没有new[]数组,那么就不需要delete[]。其他一切都是自动完成的。这就是为什么使用std::arraystd::vector等这么好的原因:使用它们时无需写new[],因此您不必担心自己可能会忘记delete[]

  

“我知道当我们有一个指向数组的指针时,这意味着它是动态创建的”

那是不正确的。您可以使用指向几乎所有内容的指针,包括堆栈变量。动态分配通常会为您提供一个指针(这可能是造成混淆的地方),但并非每个指针都来自动态分配。考虑一下:

void foo()
{
    int a;
    int* b = &a; // No dynamic allocation.
}

同样,由于这里没有new,因此应该没有delete

答案 1 :(得分:1)

  

我知道当我们有一个指向数组的指针时,这意味着它是动态创建的

不。这种归纳是不正确的。指针也可以指向非动态创建的数组。

  

所以我以后应该在析构函数中将其删除。

如果您的类实例负责破坏该数组,那么析构函数确实是应该执行此操作的地方。

  

我也需要在此正常数组的析构函数中包含一条delete语句吗?例如,我有一个普通的数组,例如int myArray [];

不。只有用new创建的对象才用delete取消样式。并且只有用new[]创建的对象才用delete[]销毁。没有别的。

  

还是程序会自动执行该操作?

是的

具有自动存储期限的对象在声明它们的作用域末尾自动销毁。这就是存储类名称的来源。 main返回后,具有静态存储持续时间的对象将被销毁。临时对象在完整表达式的末尾被销毁(除非通过将对象绑定到引用来延长其寿命)。当超级对象(在此情况下不表示基类)被破坏时,成员变量也将被破坏。

仅动态创建的对象必须手动销毁。


虽然学习如何完成很有用,但很少需要使用C ++进行手动内存管理。标准库提供了可以为您完成辛苦工作的容器。通常不用std::vector来代替动态创建数组。

答案 2 :(得分:1)

对于任何人来说,内存管理都不容易,尤其是对于那些刚接触C ++的人而言。我建议研究术语stackheap,希望可以澄清一些问题。

  

我知道当我们有一个指向数组的指针时,这意味着它是动态创建的,因此以后我应该在析构函数中将其删除。

这不是完全正确,指针只是一个变量,它保存某物的地址(变量所在的位置)。您可以将指针指向任何这样的变量:

int a = 5;
int *aPtr = &a;

这并不意味着aaPtr是动态的。

但是这样创建的指针是动态的,需要删除:

int *aPtr = new int(5);

此处最大的区别是new关键字。 new制作动态内存(将其放入堆中)。每次使用new关键字时,都应使用delete关键字进行匹配。

  

但是,如果我们有一个普通数组怎么办,我是否也需要在析构函数中为此普通数组包含一条delete语句?还是程序会自动执行此操作?例如,我有一个像这样的int myArray[];这样的普通数组,并且在我的析构函数中,我应该包括这样的内容:delete[] myArray;吗?

否,您不需要调用delete[] myArray;,因为此数组将在堆栈上生成。我的意思是,当您退出创建该数组的函数时,该数组将被清除出内存。

手动管理内存的另一种方法是使用std::arraystd::vector甚至是智能指针,例如std::unique_ptrstd::shared_ptr它不见了。

我希望这会有所帮助!

答案 3 :(得分:0)

我从答案中得到的是,如果未触发delete,则无需newdelete[]new[]也是如此。通常创建的数组(如我的问题int myArray[]中的数组)不是动态创建的,因此不需要在析构函数中动态删除它,这意味着编译器将为我执行删除操作。谢谢大家

相关问题