有人可以帮我理解这些例子吗?
我认为以下代码会生成一个包含10个指针的数组,这些指针正在使用自动内存分配。由于我们使用对象的动态内存分配,当数组超出范围时,指向数组中对象的指针会丢失,但是在调用delete之前,对象会保留在内存中。
MyClass* c[10];
c[0] = new MyClass();
我想以下示例生成了十个使用动态内存分配的对象的数组。我们必须使用delete []来删除数组和对象。
MyClass* d = new MyClass[10];
我想在下面的例子中我们正在分配一个包含50个指向对象的数组。我们是否必须在此处调用delete []或delete或两者?
MyClass** b = new MyClass*[50];
b[0] = new MyClass();
我知道我可以使用更好的东西来管理内存分配,但我被迫使用new和delete。有人可以检查我的理解是否正确并解释我在第三个例子中必须使用哪些删除?
感谢。
答案 0 :(得分:0)
我认为以下代码会生成一个包含10个指针的数组 使用自动内存分配。因为我们使用的是动态内存 对象的分配,当数组中的对象指针丢失 数组超出范围,但对象保留在内存中直到删除 被称为。
MyClass* c[10]; c[0] = new MyClass();
正确。当数组超出范围时,分配的MyClass
实例将保持活动状态,但是您错过了释放内存直到进程结束的机会(在这种情况下操作系统将释放内存)。
我猜以下示例生成了十个对象的数组 使用动态内存分配。我们必须使用delete []来删除 数组和对象。
MyClass* d = new MyClass[10];
正确。
我想在下面的例子中我们分配了一个50的数组 指向对象的指针。我们是否必须调用delete []或delete或两者 这里吗?
MyClass** b = new MyClass*[50]; b[0] = new MyClass();
第一个语句是正确的,分配了一个包含50个MyClass
指针的数组。然后分配一个MyClass
实例,并将其地址分配给该数组的第一个元素。
首先必须为数组中每个单独分配的元素调用delete
。之后,您必须在动态分配的数组上调用delete:
delete b[0];
delete[] b;
答案 1 :(得分:-1)
delete
和delete[]
是早期C ++中广泛使用的东西,但现在已经被STL容器类几乎淘汰了。
基本思想是new
在堆上创建一个类的新实例,而delete
则会破坏它。但是,如果使用new[]
创建对象数组,则需要调用delete[]
来帮助编译器。
但是,您也可以拥有一组指针。指针本身就是一个对象。所以,如果你有一个用new[]
分配的指针数组,然后每个元素都用new
分配,你必须使用普通{{1}一个一个地删除数组的内容。 },然后使用delete
删除数组本身。
幸运的是,现在我们使用delete[]
来存储对象数组。 std::vector
类型为您处理所有分配和删除,因此您只需等待其生命周期停止并为您删除对象。