例如,我有一个带有 ints 数组作为参数的构造函数的类:
A(int* array) : m_array(array) {}
我可以这样使用它:
int array[] = { ... }
A a(array);
或者像这样:
int* array = new int[10];
A a(array);
如果对象然后使用它数组,它必须(或者可能不是?)在析构函数中删除它(如果它是动态的)。但是他怎么会知道,这个数组的内存是动态分配的呢?
例如,我有一个带有 ints 数组作为参数的构造函数的类:
A(int* array) : m_array(array) {}
我可以这样使用它:
int array[] = { ... }
A a(array);
或者像这样:
int* array = new int[10];
A a(array);
如果对象然后使用它数组,它必须(或者可能不是?)在析构函数中删除它(如果它是动态的)。但是他怎么会知道,这个数组的内存是动态分配的呢?
你无法知道它是否是动态分配的,因为它毕竟int* array
是一个int
指针,而不是一个数组。你不妨通过:
int i;
A a(&i);
正如你可以想象的那样,如果你尝试delete[]
那个,或者尝试m_array[N]
使用 N > 0 访问,就会发生不好的事情。
所以你必须依靠调用者来做正确的事情;您无法验证或强制执行它。您所拥有的只是一个int
. 谁创造了它int
,或者如何或是否有更多int
的人跟随它,将是未知的。
如果您想要更安全,请使用std::vector
. 这就是它的目的。
您在构造函数中初始化数组,因此它将始终被初始化。它是在代码中预定义的,它将被分配。如果有其他构造函数没有分配你的数组,你需要做这个检查。
顺便说一句,这是假设您分配的数组是该类的成员。如果您将它分配给构造函数中的新堆栈变量,您将无法在析构函数中删除它。
您无法知道它是什么,因为静态数组也会衰减为指针。
基本上你只需要传递给构造函数的数组的值。您不需要知道它是动态分配的还是静态分配的数组。重要的是数据成员数组,它是您的类接口的一部分,您要将数据复制到其中。作为参数传递给构造函数的数组的责任应该由调用者负责,关于它的删除和生命周期。
std::vector
如果您使用而不是原始数组,它将使您的生活更轻松。
据我了解,您想问的是析构函数是否会释放您分配给数组的内存。
不,您使用 new 分配的内存必须由您在析构函数中或指针在范围内的其他地方删除,因为您的内存分配不在构造函数内部而是在外部。