我是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[];
?
预先感谢,
答案 0 :(得分:1)
但是,如果我们有一个普通数组怎么办,我是否也需要在析构函数中为此普通数组包含一条delete语句?还是程序会自动执行此操作?例如,我有一个像这样的
int myArray[];
这样的普通数组,并且在我的析构函数中,我应该包括这样的内容:delete[] myArray;
吗?
不。如果您没有new[]
数组,那么就不需要delete[]
。其他一切都是自动完成的。这就是为什么使用std::array
,std::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 ++的人而言。我建议研究术语stack
和heap
,希望可以澄清一些问题。
我知道当我们有一个指向数组的指针时,这意味着它是动态创建的,因此以后我应该在析构函数中将其删除。
这不是完全正确,指针只是一个变量,它保存某物的地址(变量所在的位置)。您可以将指针指向任何这样的变量:
int a = 5;
int *aPtr = &a;
这并不意味着a
或aPtr
是动态的。
但是这样创建的指针是动态的,需要删除:
int *aPtr = new int(5);
此处最大的区别是new
关键字。 new
制作动态内存(将其放入堆中)。每次使用new
关键字时,都应使用delete
关键字进行匹配。
但是,如果我们有一个普通数组怎么办,我是否也需要在析构函数中为此普通数组包含一条delete语句?还是程序会自动执行此操作?例如,我有一个像这样的
int myArray[];
这样的普通数组,并且在我的析构函数中,我应该包括这样的内容:delete[] myArray;
吗?
否,您不需要调用delete[] myArray;
,因为此数组将在堆栈上生成。我的意思是,当您退出创建该数组的函数时,该数组将被清除出内存。
手动管理内存的另一种方法是使用std::array
,std::vector
甚至是智能指针,例如std::unique_ptr
或std::shared_ptr
它不见了。
我希望这会有所帮助!
答案 3 :(得分:0)
我从答案中得到的是,如果未触发delete
,则无需new
。 delete[]
和new[]
也是如此。通常创建的数组(如我的问题int myArray[]
中的数组)不是动态创建的,因此不需要在析构函数中动态删除它,这意味着编译器将为我执行删除操作。谢谢大家