2

使用后必须释放结构内存吗?我有示例代码:

struct aa 
{
int a;
char * b ;
    aa()
    {
    a=0;
    b= new char[255];
    }
} ;


aa *ss = new aa[3];

void fill()
{
    aa * ssss = new aa;
    aa * sss = new aa;

    sss->a=10;
    ss[0] = *sss;
    cout<<ss[0].a<<"\n";
    ss[1] = *sss;

    cout<<ss[1].a<<"\n";
    cout<<ssss[1].a<<"\n";
}

int _tmain(int argc, _TCHAR* argv[])
{


    fill();
    delete(ss);
}

我必须delete(ssss)在最后做fill吗?

ss我必须在末尾删除结构数组main吗?

我必须创建 destruct 还是构造 ss 以释放 *b 内存?

那么类是相同的逻辑吗?

4

4 回答 4

8

我必须在填充结束时删除(ssss)吗?

是的,您必须删除使用new. 但是,这里不需要使用new,只需使其自动:

void fill() {
    aa ssss; // automatically destroyed on exit from the function
}

我必须在 main 的末尾删除结构的 ss 数组吗?

是的,但它是一个数组,所以必须作为数组删除:

delete [] ss;
       ^^

但同样,没有理由动态分配:

aa ss[3]; // automatically destroyed on exit from the program

我必须创建 destruct 还是构造 ss 以释放 *b 内存?

如果您真的想使用原始指针来管理动态数组,那么可以。您还需要考虑复制构造函数和复制赋值运算符(根据三规则),以使该类可以安全使用。或者,使用智能指针或容器为您管理内存:

struct aa 
{
    int a;
    std::vector<char> b ;

    aa() : a(0), b(255) {}
} ;

那么类是相同的逻辑吗?

是的,规则总是一样的:用 . 创建的任何东西都new必须用 . 销毁delete。如果您尽可能避免动态分配,并在您确实需要时使用智能指针、容器和其他RAII类,则管理对象会容易得多。

于 2012-07-21T14:54:59.017 回答
5

如果使用new,则必须使用delete以避免内存泄漏。如果你在栈上声明一个变量,它会在你退出作用域时被自动释放。

void something();
{
    aa b = new aa();
    // Do something
    delete b; // You must use delete
}

void something();
{
    aa b();
    // Do something
    // You don't have to use delete
}

在您的特定情况下,不一定要使用delete,因为程序无论如何都会终止,并且操作系统将释放所有分配的内存。

这样做仍然是一个好习惯,以便保持一致(尽管在某些特定情况下您不想这样做,因为释放大量复杂对象可能需要一些时间,从而减慢程序终止速度)。

无论如何,在 C++ 中使用裸指针并不是一个好主意,因为有许多所谓的智能指针(例如shared_ptrand unique_ptr)负责调用析构函数并在它们超出范围后释放内存。

PS:在您的代码中,您将有内存泄漏,因为该aa结构new在构造函数内部使用并且没有delete在析构函数中调用。

于 2012-07-21T14:47:11.717 回答
0

是的

请,请,请释放你的记忆。我不会在这里详细介绍,但看一下这个答案: Can a memory block allocation by using operator new/malloc 在程序执行结束后仍然存在?

于 2012-07-21T15:31:46.610 回答
0

经验法则C/C++

  • 分配给new? 释放内存delete
  • 分配给malloc, calloc, realloc? 释放内存free(void*)
于 2012-07-21T17:08:09.343 回答