我一直在使用C++,我一直在想新的关键字.简单地说,我应该使用它吗?
1)使用新关键字...
MyClass* myClass = new MyClass();
myClass->MyField = "Hello world!";
Run Code Online (Sandbox Code Playgroud)
2)没有新的关键字......
MyClass myClass;
myClass.MyField = "Hello world!";
Run Code Online (Sandbox Code Playgroud)
从实现的角度来看,它们看起来并没有什么不同(但我确定它们是......)但是,我的主要语言是C#,当然第一种方法就是我习惯的方法.
困难似乎是方法1更难用于std C++类.
我应该使用哪种方法?
我最近使用new关键字作为堆内存(或免费存储)用于超出范围的大型数组(即从函数返回).在我使用堆栈之前,导致一半的元素在范围之外被破坏,切换到堆使用确保元素是完整的.好极了!
我的一位朋友最近告诉我,使用new关键字有一个简单的规则; 每次打字new,输入delete.
Foobar *foobar = new Foobar();
delete foobar; // TODO: Move this to the right place.
Run Code Online (Sandbox Code Playgroud)
这有助于防止内存泄漏,因为您总是必须将删除放在某处(即,当您将其剪切并粘贴到析构函数或其他方式时).
我已经搜索过了,但我对这三个概念并不是很了解.我何时必须使用动态分配(在堆中)以及它的真正优势是什么?静态和堆栈有什么问题?我可以编写整个应用程序而无需在堆中分配变量吗?
我听说其他语言包含了"垃圾收集器",所以你不必担心内存.垃圾收集器做什么?
您可以自己操作内存,而不能使用此垃圾收集器吗?
有人告诉我这个声明:
int * asafe=new int;
Run Code Online (Sandbox Code Playgroud)
我有一个"指针指针".这是什么意思?它不同于:
asafe=new int;
Run Code Online (Sandbox Code Playgroud)
?
我已经编程了一段时间,但它主要是Java和C#.我实际上从来没有必须自己管理内存.我最近开始用C++编程,我有点困惑的是什么时候我应该把东西存放在堆栈上以及何时将它们存储在堆上.
我的理解是,非常频繁访问的变量应该存储在堆栈中,对象,很少使用的变量和大型数据结构都应该存储在堆上.这是正确的还是我错了?
可能重复:
我何时应该在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)
有人可以为我澄清何时使用新操作员以及何时不使用?
重复:
有关:
可能重复:
何时最好使用堆栈而不是堆,反之亦然?
我已经阅读了关于堆与堆栈的其他一些问题,但它们似乎更关注堆/堆栈的作用而不是使用它们的原因.
在我看来,堆栈分配几乎总是首选,因为它更快(只需移动堆栈指针与在堆中查找可用空间),并且您在使用它时不必手动释放已分配的内存.我可以看到使用堆分配的唯一原因是,如果要在函数中创建对象,然后在函数作用域之外使用它,因为堆栈分配的内存在从函数返回后自动取消分配.
还有其他原因使用堆分配而不是我不知道的堆栈分配吗?
好吧,所以我确实发现了一些几乎相似的问题,但实际上他们对指针更加困惑.
在上面的链接中,他们说如果你声明一个指针它实际上保存在堆上而不是堆栈上,无论它在何处被声明.这是真的 ??还是我误会了?我认为无论指针还是非指针,如果它是一个全局变量,它就和应用程序一样长.如果它是一个局部变量或在循环或函数内声明,它的生命只与其中的代码一样长.
// the malloc style, which returns a pointer:
struct Cat *newCat = malloc(sizeof(struct Cat));
// no malloc...but isn't it actually the same thing? uses memory as well, or not?
struct Cat cat = {520.0f, 680.0f, NULL};
Run Code Online (Sandbox Code Playgroud)
基本上,我可以通过这两种方式获得初始化结构.我的猜测是:它是一样的,但是当我使用malloc时我也必须释放().在第二种情况下,我不必考虑内存,因为我不调用malloc.也许.
我何时应该使用malloc风格,何时使用另一个?
由于我有 C# 背景,我有一些习惯需要改变。我试图从函数返回 QList<int> 。编译器错误消息是请求从“QList*”转换为非标量类型“QList”。这是函数:
QList<int> toCategories(QVariant qv)
{
QList<int>categories = new QList<int>();
if(qv.isValid() && qv.type() == QVariant::List)
{
foreach(QVariant category,qv.toList()){
categories.append(category.toInt() );
}
}
return categories;
}
Run Code Online (Sandbox Code Playgroud)
我很感激使用正确语法的文档或函数的链接