这是对我之前的一个问题的跟进。我正在处理的问题在上述问题的表述中进行了详细解释。不幸的是,我无法提供一个展示问题的最小示例。
在这个问题中,我试图重新定义问题并提供一个最小的例子。下面示例中显示的代码执行并执行它应该做的事情。但是,在上一个问题中提出的稍微复杂的情况下,有时会导致运行时错误
dynamic_links(3941,0x7fff749a2310) malloc: *** error for object 0x61636f6c65720054: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
不幸的是,我只能在优化设置为-O3
(可能-O2
也是)时产生错误。这在使用调试工具时会产生问题。不幸的是,我无法通过没有/最少的代码优化来重现问题。作为参考,我正在使用gcc 4.9.1
.
在目前的问题中,我想了解我正在使用的类继承机制的结构设计是否可能从动态内存分配的角度来看是危险的。请在下面找到代码:
namespace ublas = boost::numeric::ublas;
template<typename TScalarType = double>
using ublasRn = ublas::vector<TScalarType>;
class Base
{
public:
virtual ~Base(void) = 0;
};
Base::~Base(void){}
template<typename T1, typename T2>
class Composite : public Base
{
protected:
T1 T1Instance;
std::unique_ptr<T2> u_T2Instance;
public:
Composite(){}
virtual ~Composite(void){}
const std::type_info& returnT1TypeID(void) const
{return typeid(T1);}
const std::type_info& returnT2TypeID(void) const
{return typeid(T2);}
};
template<typename T2>
class CompositeCT: virtual public Composite<double, T2>
{
public:
using Composite<double, T2>::Composite;
virtual ~CompositeCT(void)
{}
};
template<typename T1>
class CompositeRn: virtual public Composite<T1, ublasRn<double>>
{
public:
using Composite<T1, ublasRn<double>>::Composite;
virtual ~CompositeRn(void){}
};
class CompositeCTRn :
public CompositeCT<ublasRn<double>>,
public CompositeRn<double>
{
public:
CompositeCTRn(void):
Composite<double, ublasRn<double>>(),
CompositeCT<ublasRn<double>>(),
CompositeRn<double>()
{};
};
template<typename T1, typename T2, class TComposite>
class Trajectory: public Base
{
protected:
std::vector<std::unique_ptr<TComposite>> m_Trajectory;
public:
Trajectory(void)
{checkType();}
void checkType(void) const
{
TComposite CI;
if (
!(
CI.returnT1TypeID() == typeid(T1) &&
CI.returnT2TypeID() == typeid(T2)
)
)
throw std::runtime_error("Error");
}
virtual ~Trajectory(void){}
};
int main()
{
Trajectory<
double,
ublasRn<>,
CompositeCTRn
> T;
std::cout << 123 << std::endl;
}
笔记。我正在使用外部库boost::ublas。我相信问题与ublas
对象的动态内存分配机制有关的可能性不大。