这个内存分配在哪里 - 堆还是堆栈?

时间:2016-02-17 01:45:38

标签: c++ memory memory-management

我有以下C ++代码。因为,内存是动态分配的,所以应该在堆上分配。或者,既然内存已经在声明时分配,而不是在任何构造函数中分配,它是否在堆栈上分配?我需要一个解构函数来释放内存吗?

class param{
public:
    char* st = new char[256];
};

以下情况会发生什么?我想这是在堆栈上分配的,不需要使用解构器来释放。

class param{
public:
    char st[256];
};

第三种方式是将其写成:

class param{
public:
    char* st;
    param()
    {
        st = new char[256];
    }

    ~param()
    {
       delete[] st;
    }
};

上述三个中哪一个是正确的方法?

2 个答案:

答案 0 :(得分:2)

  

因为内存是在声明时分配的,而不是在任何构造函数中分配,是否在堆栈上分配?

不,它仍然是动态分配的。

  

我是否需要一个解构函数来释放内存?

您按operator new[]分配内存,因此您需要调用operator delete[]来解除分配。

其他建议:

  1. 考虑使用std::vectorstd::array,因为它是C ++。

  2. 对于第三种情况,请参阅What is The Rule of Three?Rule-of-Three becomes Rule-of-Five with C++11?

答案 1 :(得分:1)

始终在堆上分配

new

在第一个示例中,来自new的指针被放入类成员中。

可以在堆栈上实例化此类的实例;或者可以通过new在堆本身上实例化类的实例。无论是在堆上还是在堆栈上,无论实例化类本身的哪种方式,其成员st将始终指向堆分配的内存。

在第二个示例中,成员st是该类的一部分。在给出的示例中没有实例化。它只是一个类声明。当类的实例被实例化时,它可以在堆上或堆栈上实例化,在任何一种情况下st成员都是类的一部分,并且与该特定类实例一起实例化。

至于哪个"正确"这三个例子都是正确的。或者他们三个都可能是错的。这一切都取决于课程的使用方式。通常,第二个或第三个示例是最方便的实现方式,并且可以减少意外。

但是,即使第一个例子是正确的,也有可能提出一些深奥的情况。