new/ delete和malloc/有free什么区别?
相关(重复?):在什么情况下我使用malloc vs new?
可能重复:
我何时应该在C++中使用new关键字?
我什么时候应该在C++中使用"new"运算符?我来自C#/ Java背景,实例化对象让我感到困惑.
如果我创建了一个名为"Point"的简单类,当我创建一个点时,我应该:
Point p1 = Point(0,0);
Run Code Online (Sandbox Code Playgroud)
要么
Point* p1 = new Point(0, 0);
Run Code Online (Sandbox Code Playgroud)
有人可以为我澄清何时使用新操作员以及何时不使用?
重复:
有关:
main例如,在我的C++ 函数中,如果我有一个指向使用堆内存的变量的指针(而不是堆栈内存) - 在我的应用程序退出后会自动解除分配吗?我会这么认为.
即便如此,即使您认为永远不会在退出时自动释放内存的情况下使用堆分配,也总是删除堆分配是一种好习惯吗?
例如,这样做有什么意义吗?
int main(...)
{
A* a = new A();
a->DoSomething();
delete a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想也许以防我重构(或其他人重构)代码并将其放在应用程序的其他地方,这delete真的是必要的.
除了Brian R. Bondy(其中特别谈到C++中的含义)的答案之外,Paul Tomblin 对C特定问题也有一个很好的答案,该问题也讨论了C++析构函数.
如何跟踪C++中的内存分配,尤其是new/ delete.对于一个对象,我可以轻松覆盖operator new,但我不确定如何全局覆盖所有分配,以便它们通过我的自定义new/ delete.这应该不是一个大问题,但我不确定应该怎么做(#define new MY_NEW?).
一旦这个工作,我会认为它足以在分配的指针/位置的某处有一个映射,所以我可以跟踪当前"活动"的所有分配,并且 - 在应用程序结束时 - 检查分配没有被释放的.
好吧,这似乎再次像肯定已经多次完成了几次,所以任何好的库(最好是便携式的)?
使用delete而不是delete[]?有什么问题?
在分配和释放数组的过程中是否有一些特殊的事情发生?
为什么它会malloc与免费不同?
我有这样的结构:
class Items
{
private:
struct item
{
unsigned int a, b, c;
};
item* items[MAX_ITEMS];
}
Run Code Online (Sandbox Code Playgroud)
假设我想'删除'一个项目,如下所示:
items[5] = NULL;
Run Code Online (Sandbox Code Playgroud)
我后来在同一个地方创建了一个新项目:
items[5] = new item;
Run Code Online (Sandbox Code Playgroud)
我还需要打电话delete[]来清理它吗?或者不需要这样,因为items[]在编译之前已知数组的边界?
将该指针设置为NULL有效还是应该在那里调用delete?
我知道,我应该用delete []我使用后new [],所以使用auto_ptr与new []没有这样的好主意.
但是,在调试时delete [](使用Visual Studio 2005),我注意到调用进入了一个如下所示的函数:
void operator delete[]( void * p )
{
RTCCALLBACK(_RTC_Free_hook, (p, 0))
operator delete(p);
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着,[]Visual C++上的语法丢失了?如果是这样,为什么?是否可以减轻开发人员记住正确语法的负担?
假设我有自己创建的链接列表.它有自己的析构函数,可以释放内存.此链接列表不会超载新的或删除.
现在,我正在尝试创建一个所述链表的数组(如果我理解正确,则打开哈希).然后我在这个open anhing类的构造函数中分配必要的内存.在构造函数中调用的新运算符足以正确地为数组分配内存,对吧?我不确定,因为我没有为Linked List类重载新内容.
另外,假设我的链接列表数组被称为元素,我可以在析构函数中写"delete [] elements"吗?是否会为数组中的每个元素调用析构函数并正确释放内存?
最后,如果我的两个假设都是正确的(即,我不需要重载new和delete以将它们与我的自定义类一起使用),那么重载这些运算符的重点是什么?
我无法帮助阅读关于析构函数的大量论坛帖子并完全混淆.
有人说调用析构函数(带delete)一次为每个调用到new.有人说析构函数会在各种情况下自动调用,即 当指针被重新分配时,当对象超出范围时.有人建议指针超出范围,同时作为返回值,其中对象作为其前自身的副本存在,(这是否需要显式销毁,因为它最初是用new?创建的?
似乎有一些建议是不止一次地调用相同的析构函数会破坏内存,因此所有delete调用都应该与之合作*pointer = NULL;以避免损坏.如果没有,那么一些更高级的对象管理系统将需要实施,或铁腕严格的所有权.
我似乎无法对调用析构函数序列进行任何讨论,即调用1)是否源自基类超类并级联到特定类,在路上调用所有虚拟化析构函数,2)源于实例化class并向上移动到超类,或3)发起类在超出范围时所具有的特定强制转换,然后遍历实例化和基类.做级联析构
最终,我根本不知道如何或何时删除对象,无论对象是否负责删除它们引用的所有对象,如何干净地处理适当的面向对象的删除例程,其中多次引用对象,它只是一个我脑子里一团糟.正如你所看到的那样,我无法真正提出一个可靠的问题,我真的希望有人可以提供一个简洁而简洁的讨论,如果不是单一的"正确"方法,至少是行业最佳实践来反对删除.
在函数内部的堆上创建数组时,是否有必要在主函数中删除该数组?考虑一下,这个程序:
#include "stdafx.h"
#include <iostream>
using namespace std;
int * return_array() {
int* my_array = new int[10];
my_array[0] = 10;
return my_array;
}
int main()
{
int * returned_array = return_array();
cout << returned_array[0];
delete[] returned_array;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这行:int* my_array = new int[10];是否需要在主程序中删除?我发现每次执行此操作都很难维护和正确。
c++ ×10
new-operator ×4
arrays ×2
destructor ×2
c ×1
c++17 ×1
constructor ×1
debugging ×1
dynamic ×1
heap ×1
struct ×1
visual-c++ ×1