我有以下代码段:
A.h
include B.h
class A
{
public:
void createB();
B* getB();
private:
B *b;
};
A.cpp
void A::createB()
{
b = new B();
}
B* A::getB()
{
return b;
}
Main.cpp
int main()
{
int n = 3;
A *a_array = new A[n];
for ( int i = 0; i < n; i++ ) {
A *a = new A();
a_array[i] = *a;
}
for ( int i = 0; i < n; i++ ) {
A a = a_array[i];
a.createB();
}
a_array[0].doStuff(); // OK
a_array[0].getB(); // returns NULL
}
Output:
A created
A created
A created
B created
A destroyed
B created
A destroyed
B created
A destroyed
似乎A对象在循环中被销毁,但我没有循环访问它们,但无法访问A的对象成员。
答案 0 :(得分:2)
问题是在第二个循环中,您在数组a_array
中相应元素的副本上调用createB。尝试将循环更改为:
for ( int i = 0; i < n; i++ ) {
A& a = a_array[i];
a.createB();
}
另请注意,您的程序中存在大量内存泄漏 - 您分配了许多永远不会释放的内容。
在第一个循环中,在将其分配给数组中的元素之前,不需要动态分配。简单地说(正如Pete Becker所指出的那样):
for ( int i = 0; i < n; i++ ) {
a_array[i] = A();
}
答案 1 :(得分:0)
int main()
{
int n = 3;
A *a_array = new A[n];
for ( int i = 0; i < n; i++ ) {
A *a = new A();
a_array[i] = *a; // here you are copying a and then causing a memleak
}
你可能意味着什么
A **a_array = new A*[n];
for ( int i = 0; i < n; i++ ) {
A *a = new A();
a_array[i] = a; // now array points to instance of a
}
现在当你引用指针时:
for ( int i = 0; i < n; i++ ) {
A* a = a_array[i];
a->createB();
}
a_array[0]->doStuff(); // OK
a_array[0]->getB(); // returns NULL
...
不要忘记删除。
的数组和实例然而,你应该看一下vector<>
和array<>
,使用STL容器会更好
答案 2 :(得分:0)
第二个for循环中的a = a_array [i]在堆栈上创建一个副本,在循环范围之后再次删除。循环后的a_array [0]访问引用另一个对象。