动态分配的对象 C++

5
大家好,我有一个快速的问题。我正在重新学习C++,想了解以下内容:
如果我有一个动态分配的对象:
MyObject* obj = new MyObject();

它作为成员包含一个数组:

class MyObject 
{
public:
   MyObject();
   ~MyObject();
   float array[16];
   private:
};

只是进行普通的删除操作:

delete obj;

在释放对象的所有内存(包括数组)时,我需要做些特殊的事情吗?还是只需要释放即可?


2
是的,它会。在这方面上,数组与其他内置类型没有任何区别。 - juanchopanza
2个回答

3

没错,你做得很好。对象的所有内存将会被释放。

附:如果你在类中动态创建了内存,应该在析构函数 ~MyObject() 中释放它们的内存。

例如:

class MyObject
{
public:
    /** Constructor */
    MyObject() : test(new int[100]) {}
    /** Destructor */
    ~MyObject() { delete []test; };  // release memory in destructor 
    /** Copy Constructor */
    MyObject(const MyObject &other) : test(new int[100]){
        memcpy(test, other.test, 100*sizeof(int));
    }
    /** Copy Assignment Operator */
    MyObject& operator= (MyObject other){
        memcpy(test, other.test, 100 * sizeof(int));
        return *this;
    }

private:
    int *test;
};

p.s.2: 需要额外的复制构造函数和拷贝赋值运算符来遵循三大法则


@juanchopanza,在修复所有语法问题后,您所说的 break 是什么意思? - herohuyongtao
参见三法则。想象一下如果复制此类会发生什么。 - Chris Drew
1
例如 int* test 这样的定义是不好的。使用一个能够自动管理内存的容器。 - M.M
1
@MattMcNabb 使用 int *test 只是为了说明如何在类中管理动态创建的内存。 - herohuyongtao

0

是的,如果数组是固定大小且未动态分配,则内存将在MyObject的析构函数中释放。您可能会发现使用std::array更方便地持有固定大小的数组:

#include <array>

struct MyObject {
  std::array<float, 10> array;
};

此外,如果您要动态分配 MyObject 的内存,我建议使用像 unique_ptr 这样的智能指针:
#include <memory>

auto my_object = std::unique_ptr<MyObject>(new MyObject);
//auto my_object = std::make_unique<MyObject>(); // C++14

如果您需要一个变量大小的、动态分配的数组,我建议使用一个 vector
#include <vector>

struct MyObject {
  std::vector<float> array;
};

在这种情况下,当调用MyObject析构函数时,分配给数组的内存将被释放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接