【问题标题】:Dynamically allocated object C++动态分配的对象 C++
【发布时间】:2025-11-22 11:20:03
【问题描述】:

大家好,我有一个简短的问题。我正在重新使用 C++ 并且想知道这一点

如果我有动态分配的对象:

MyObject* obj = new MyObject();

它内部有一个数组作为成员:

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

只会做一个正常的删除:

delete obj;

对对象释放所有内存(包括数组)?还是我需要为此做一些特别的事情?

【问题讨论】:

  • 是的,它会的。在这方面,数组与其他内置类型没有什么不同。

标签: c++ arrays object memory dynamic


【解决方案1】:

是的,你做得很好。对象的所有内存都会被释放。

p.s.:如果你也在类内部动态创建内存,你应该在析构函数~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:需要额外的复制构造函数和 dopy 赋值运算符才能使其遵循Rule of three

【讨论】:

  • @juanchopanza break 是什么意思(在解决所有语法问题之后)?
  • Rule of Three。想象一下如果你复制这个类会发生什么。
  • -1 例如int* test,这是个坏主意。使用管理自己内存的容器。
  • @MattMcNabb 使用int *test 只是为了说明如何在类中管理动态创建的内存。
【解决方案2】:

是的,如果数组是固定大小并且不是动态分配的,那么内存将在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 析构函数时被释放。

【讨论】:

    最近更新 更多