构造函数没有被调用

时间:2019-05-16 02:33:26

标签: c++ stdlist

我正在制作4个std :: list数组。但是,当我尝试访问数组的第一个列表的第一个A对象并对其调用callMe()方法时,我得到一个奇怪的输出。

现在可能发生了两件事:

  1. 该列表为空。
  2. 当我尝试访问第一个列表的第一个元素((*(arrayOflistOfA [0] .begin())))时,创建了一个A对象。

以上情况的详细信息:

  1. 如果没有创建任何对象,那么我应该有一个例外。但是我没有任何异常,所以我假设创建了一个A对象。
  2. 因此,如果确实创建了A对象,则应该调用构造函数。

我想念什么?

#include <iostream>
using namespace std;
class A {
public:
    A() {
        cout<<"Constructor called"<<endl;
        x=20;
    }
    void callMe();
private:
    int x;
};

void A::callMe() {
    cout<<"Value of x = "<<x<<endl;
}

int main() {
    const int size = 4;
    list<A>* arrayOflistOfA = new list<A>[size];
    (*(arrayOflistOfA[0].begin())).callMe();
}

输出为:

Value of x = 0

但是输出应该是:

Constructor called
Value of x = 20

3 个答案:

答案 0 :(得分:1)

您实际上并没有在列表中填充任何值。我测试了以下代码,并添加了注释说明。

#include <iostream>
#include <list>
using namespace std;
class A {
public:
    A();
    void callMe();
private:
    int x = 0;
};

A::A()
{
    cout << "Constructor called" << endl;
    x = 20;
}

void A::callMe() {
    cout << "Value of x = " << x << endl;
}

int main() {
    const int size = 4;
    list<A>* arrayOflistOfA = new list<A>[size];
    cout << arrayOflistOfA->size() << endl; // As you can see, size is 0 here - you created a list of nulls.

    for (int i = 0; i < size; i++)
    {
        arrayOflistOfA->push_back(A());
    }

    // The below code demonstrates how to loop through the array once it's populated.
    list<A>::iterator it;
    for (auto& a : *arrayOflistOfA)
    {
        a.callMe();
    }
    return 0;
}

答案 1 :(得分:1)

  

如果没有创建A对象,那么我应该有一个例外。

不正确。

  

但是我没有得到任何异常,所以我假设创建了一个A对象。

不要假设查找。。转到begin()和迭代器的一些文档,发现you get UB没有异常。

  

当我尝试访问第一个列表((*(arrayOflistOfA[0].begin())))的第一个元素时,创建了一个A对象。 [并且]如果确实创建了A对象,则应该调用构造函数。

是的。显然,列表中没有元素。

我们知道,因为您的程序中没有adds elements to the list的代码。

除非您确实需要(我从未发现需要这样做),否则您不应该动态分配容器。

答案 2 :(得分:0)

我得到了我问题的答案。首先,我尝试使用GNU C ++编译器在Mac上运行此代码,但是当我在iPhone模拟器上运行相同的代码时,它崩溃了。因此,正如@PaulMcKenzie所述,我确实确实在试图取消引用无效的迭代器。