相关疑难解决方法(0)

279
推荐指数
8
解决办法
19万
查看次数

何时使用"new"和何时不使用,在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)

有人可以为我澄清何时使用新操作员以及何时不使用?

重复:

我什么时候应该在C++中使用new关键字?

有关:

关于C++中用于自定义对象的构造函数/析构函数和new/delete运算符

在C++中适当的堆栈和堆使用?

c++ new-operator

98
推荐指数
2
解决办法
11万
查看次数

当程序退出时,是否有理由在C++中调用delete?

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++ heap memory-management dynamic

44
推荐指数
5
解决办法
2万
查看次数

如何在C++中跟踪内存分配(尤其是新建/删除)

如何跟踪C++中的内存分配,尤其是new/ delete.对于一个对象,我可以轻松覆盖operator new,但我不确定如何全局覆盖所有分配,以便它们通过我的自定义new/ delete.这应该不是一个大问题,但我不确定应该怎么做(#define new MY_NEW?).

一旦这个工作,我会认为它足以在分配的指针/位置的某处有一个映射,所以我可以跟踪当前"活动"的所有分配,并且 - 在应用程序结束时 - 检查分配没有被释放的.

好吧,这似乎再次像肯定已经多次完成了几次,所以任何好的库(最好是便携式的)?

c++ debugging memory-management

30
推荐指数
4
解决办法
3万
查看次数

为什么有一个特殊的new和删除数组?

使用delete而不是delete[]?有什么问题?

在分配和释放数组的过程中是否有一些特殊的事情发生?

为什么它会malloc与免费不同?

c c++ arrays memory-management new-operator

11
推荐指数
4
解决办法
2048
查看次数

结构数组和新/删除

我有这样的结构:

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?

c++ arrays struct memory-management new-operator

7
推荐指数
2
解决办法
2万
查看次数

在Visual C++中删除和删除[]相同?

我知道,我应该用delete []我使用后new [],所以使用auto_ptrnew []没有这样的好主意.

但是,在调试时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++上的语法丢失了?如果是这样,为什么?是否可以减轻开发人员记住正确语法的负担?

c++ visual-c++

6
推荐指数
1
解决办法
3396
查看次数

关于C++中用于自定义对象的构造函数/析构函数和new/delete运算符

假设我有自己创建的链接列表.它有自己的析构函数,可以释放内存.此链接列表不会超载新的或删除.

现在,我正在尝试创建一个所述链表的数组(如果我理解正确,则打开哈希).然后我在这个open anhing类的构造函数中分配必要的内存.在构造函数中调用的新运算符足以正确地为数组分配内存,对吧?我不确定,因为我没有为Linked List类重载新内容.

另外,假设我的链接列表数组被称为元素,我可以在析构函数中写"delete [] elements"吗?是否会为数组中的每个元素调用析构函数并正确释放内存?

最后,如果我的两个假设都是正确的(即,我不需要重载new和delete以将它们与我的自定义类一起使用),那么重载这些运算符的重点是什么?

c++ constructor destructor new-operator

3
推荐指数
1
解决办法
9147
查看次数

c ++ Destructors,何时何地?

我无法帮助阅读关于析构函数的大量论坛帖子并完全混淆.

有人说调用析构函数(带delete)一次为每个调用new.有人说析构函数会在各种情况下自动调用,即 当指针被重新分配时,当对象超出范围时.有人建议指针超出范围,同时作为返回值,其中对象作为其前自身的副本存在,(这是否需要显式销毁,因为它最初是用new?创建的?

似乎有一些建议是不止一次地调用相同的析构函数会破坏内存,因此所有delete调用都应该与之合作*pointer = NULL;以避免损坏.如果没有,那么一些更高级的对象管理系统将需要实施,或铁腕严格的所有权.

我似乎无法对调用析构函数序列进行任何讨论,即调用1)是否源自基类超类并级联到特定类,在路上调用所有虚拟化析构函数,2)源于实例化class并向上移动到超类,或3)发起类在超出范围时所具有的特定强制转换,然后遍历实例化和基类.做级联析构

最终,我根本不知道如何或何时删除对象,无论对象是否负责删除它们引用的所有对象,如何干净地处理适当的面向对象的删除例程,其中多次引用对象,它只是一个我脑子里一团糟.正如你所看到的那样,我无法真正提出一个可靠的问题,我真的希望有人可以提供一个简洁而简洁的讨论,如果不是单一的"正确"方法,至少是行业最佳实践来反对删除.

c++ destructor

3
推荐指数
1
解决办法
1189
查看次数

从函数返回数组时是否需要删除

在函数内部的堆上创建数组时,是否有必要在主函数中删除该数组?考虑一下,这个程序:

#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++ c++17

2
推荐指数
1
解决办法
124
查看次数