如何删除 *new

问题描述 投票:0回答:2

我对C ++中的内存管理有疑问 在下面的示例中,有任何内存泄漏。如果是这样,如何清除内存。 另外, * new是唯一使用的选择,而不是int num = 25;

int main()
{
  for(int i = 0;i < 200;i++)
  {
    int num = * new int(25);
  }

我尝试了多种方法,但删除和免费行动不起作用

c++ memory-leaks
2个回答
2
投票

op:也可以定义int * new是唯一使用的选项,而不是int num = 25;

没有,在

C++
中,您有不同的方式创建新数据。简而言之,您可以自动,动态或静态创建新数据。

automatic storage duration

A a obj;
在这里,您正在创建一个具有自动存储持续时间的对象,这意味着,当对象脱离范围时,将清理该对象。该对象是直接在当前活动

stack frame中创建的,因此可以通过标识符直接加入。

dynamic storage duration

dynamic存储的对象是用

new
运算符创建的。这些对象存储在
heap

上,该对象是保留用于处理

heap allocations

的无序(主要是)内存的区域。 
heap
无法直接与堆栈区域进行交谈,但是我们可以与指针传达
stack
heap
程序的数据。
new
操作员在对象构造器上的前面调用,将执行
heap
分配,将值放在

heap

的某个位置,然后返回

pointer
到该值所在的内存地址,可在活动堆栈中可用。
A* a obj = new A();
在这里,我们正在遵循一种资源,作为开发人员,我们必须关注。因此,当我们以
C++
对象结束时,我们必须告诉编译器我们完成了它的完成,并且该记忆应释放或释放。我们用
a
关键字来实现这一点。

C++
如果我们不删除动态构造的资源,我们将产生内存泄漏。这是,我们将访问权限(返回的指针)丢给了资源,我们无法再实现它。因此,该资源将使用内存,直到

delete

自然声称内存(这也不会发生),处于
未定义的行为状态,有可能导致崩溃和其他事物。
A* a obj = new A();

/* snip */

delete a;

当程序启动并在程序结束时分配对象的存储。该对象的实例存在。在命名空间范围(包括全局名称空间)上声明的所有对象都有此存储持续时间,以及用静态或外部声明的对象

OS

当线程开始并在线程结束时分配对象的存储。每个线程都有自己的对象实例。只有声明为thread_local的对象具有此存储持续时间。 thread_local可以与静态或外部一起出现以调整链接。

您的代码段有什么问题?
static storage duration

您正在动态初始化具有值的变量。这是因为您是

thread storage duration
运算符返回的指针,失去了对分配变量的访问权限。 
int num = * new int(25);

不起作用,因为您需要指针类型将操作员应用于其上,并将资源删除超出指针,这将是表达式

dereferencing

的结果。这将返回一个将存储动态初始化整数的地址。

可能,您正在寻找类似的东西:
new

Tl;dr

您的递延,或按照指针遵循

heap

构建器上应用的
delete
关键字返回到您的内存地址,然后在

new int (25)

变量中保存值(而不是指针!),从而失去了对堆分配的数据的访问,并造成
memorylevule
memorylevule
mmemorylevule

    

有任何内存泄漏

是的。您通过

int*
创建了一个
for(int i = 0;i < 200;i++) { int* num = new int(25); /* snip */ delete num; }

,并立即失去对指针的任何引用。

是否因此如何清除内存


你不能。 
new
仅保存该值的副本。您无法进行动态分配的实际
intint num


1
投票
也是 * new的定义int是唯一使用的选项,而不是int num = 25;

那没有道理。也许您没有提及某些内容(奇怪的要求,怪异的作业或类似),但是根据您的说法,这是“管理内存”的正确方法:

int

new
具有自动存储持续时间。当它脱离范围时,它的记忆将被释放。

我尝试了多种方法,但删除和免费行动不起作用

对于

num

,您需要由
delete
返回的指针。你没有那个。混合
int
for(int i = 0;i < 200;i++) { int num = 25; }

是错误的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.