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