我正在制作4个std :: list数组。但是,当我尝试访问数组的第一个列表的第一个A对象并对其调用callMe()方法时,我得到一个奇怪的输出。
现在可能发生了两件事:
以上情况的详细信息:
我想念什么?
#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
答案 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所述,我确实确实在试图取消引用无效的迭代器。