在调用父类构造函数时和调用子构造函数时,基类受保护成员的值正在更改值时,我遇到了一个错误。简化后的代码版本如下:
Namespace A
{
class Parent
{
public:
Parent (int a, int b, int c, int d);
protected:
std::vector<Eigen::Matrix<float, 3, 3, Eigen::RowMajor>> rmats_;
}
}
A::Parent::Parent (int a, int b, int c, int d) {
rmats_.reserve(3000);
rmats_.clear ();
Eigen::Matrix<float, 3, 3, Eigen::RowMajor> init_Rcam_ = Eigen::Matrix3f::Identity ();
rmats_.push_back(init_Rcam_);
std::cout << "size of rmats is " << rmats_.size() << std::endl;
}
Namespace B
{
class Child : public Parent
{
public:
Child(int a, int b, int c, int d);
}
}
B::Child::Child : A::Parent::Parent(a,b,c,d)
{
std::cout << "size of rmats in the child is " << rmats_.size() << std::endl;
}创建子对象时,父构造函数中的大小报告预期大小为1,但是子构造函数中的输出报告向量的大小现在为127101589483567331。在实际代码中还有其他几个类似对象的向量,所有这些向量都报告了不正确的矢量大小,包括尺寸1的另一个向量更改为0,以及大小3的向量更改为668637816。
我尝试使用更简单的代码版本,使用整数向量并获得预期的结果,但是,在两个打印cout语句之间不做任何附加操作的完整代码表明,向量的大小在父构造函数和子构造函数之间发生变化。此外,代码似乎在Linux下使用gcc正常工作,但在windows下使用visual studio中断。
在施工过程中是否有其他隐藏步骤会导致此错误?任何可能导致此类问题的编译器设置?
发布于 2015-03-10 17:17:08
根据C++中的构造规则,子构造函数将始终打印大小为1的子构造函数。在父构造函数完全完成之前,子构造函数的构造代码根本不执行(更多在C++:构造和初始化顺序保证上)。
看起来,Child类使用的是向量的垃圾内存地址。
Child.hpp和Parent.cpp是否可能包含不同版本的Parent.hpp文件(您有二进制/头不匹配)?
发布于 2015-03-10 17:13:01
您的构造函数定义是错误的,在您的示例中有输入法,并且没有正确调用基本构造函数。
如果对父构造器定义使用正确的A::Parent::Parent(...) { }语法,对子构造函数使用B::Child::Child(...) : A::Parent(...) { },则示例将进行编译。
看到它在ideone.com中工作
发布于 2015-03-10 18:07:47
它只在windows上中断,使用类似于此的生产代码,但是这个测试片段在windows和posix上正确工作吗?
检查安装在windows框上的Eigen库版本。
在销毁init_Rcam_时,检查std::vector是否发生了任何奇怪的事情(这应该很好,因为std::载体应该有一个副本)。
检查在退出A::Parent::Parent()构造函数时可能损坏内存的无关错误,但在提取工作的简化代码时,这些错误似乎与此无关。
https://stackoverflow.com/questions/28969481
复制相似问题