2

例如,我有一个带有 ints 数组作为参数的构造函数的类:

A(int* array) : m_array(array) {}

我可以这样使用它:

int array[] = { ... }
A a(array);

或者像这样:

int* array = new int[10];
A a(array);

如果对象然后使用它数组,它必须(或者可能不是?)在析构函数中删除它(如果它是动态的)。但是他怎么会知道,这个数组的内存是动态分配的呢?

4

4 回答 4

2

你无法知道它是否是动态分配的,因为它毕竟int* array是一个int指针,而不是一个数组。你不妨通过:

int i;
A a(&i);

正如你可以想象的那样,如果你尝试delete[]那个,或者尝试m_array[N]使用 N > 0 访问,就会发生不好的事情。

所以你必须依靠调用者来做正确的事情;您无法验证或强制执行它。您所拥有的只是一个int. 谁创造了它int,或者如何或是否有更多int的人跟随它,将是未知的。

如果您想要更安全,请使用std::vector. 这就是它的目的。

于 2012-11-25T11:11:20.200 回答
0

您在构造函数中初始化数组,因此它将始终被初始化。它是在代码中预定义的,它将被分配。如果有其他构造函数没有分配你的数组,你需要做这个检查。

顺便说一句,这是假设您分配的数组是该类的成员。如果您将它分配给构造函数中的新堆栈变量,您将无法在析构函数中删除它。

于 2012-11-25T11:11:02.863 回答
0

您无法知道它是什么,因为静态数组也会衰减为指针。

基本上你只需要传递给构造函数的数组的值。您不需要知道它是动态分配的还是静态分配的数组。重要的是数据成员数组,它是您的类接口的一部分,您要将数据复制到其中。作为参数传递给构造函数的数组的责任应该由调用者负责,关于它的删除和生命周期。

std::vector如果您使用而不是原始数组,它将使您的生活更轻松。

于 2012-11-25T11:12:21.233 回答
0

据我了解,您想问的是析构函数是否会释放您分配给数组的内存。

不,您使用 new 分配的内存必须由您在析构函数中或指针在范围内的其他地方删除,因为您的内存分配不在构造函数内部而是在外部。

于 2012-11-25T11:12:56.257 回答