#include <iostream>
#include <assert.h>
using namespace std;
struct Base
{
Base() : m_member1(1) {}
Base(const Base & other)
{
assert(this != &other); // this should trigger
m_member1 = other.m_member1;
}
int m_member1;
};
struct Derived
{
Derived(Base & base) : m_base(m_base) {} // m_base(base)
Base & m_base;
};
void main()
{
Base base;
Derived derived(base);
cout << derived.m_base.m_member1 << endl; // crashes here
}
以上示例是错误构造函数的合成版本。
我在类成员Derived::m_base
中使用了引用,因为我想确保成员将在构造函数调用时初始化。
一个问题是GCC和MSVC也没有在m_base(m_base)
给我一个警告。但对我来说更严重的是断言发现一切正常,应用程序崩溃(有时远离错误)。问题:有没有办法表明这样的错误?
答案 0 :(得分:3)
断言不会触发,因为您未在通话Base
中创建m_base(m_base)
的实例。这只是初始化引用Base& m_base
。如果您确实想要调用复制构造函数,请将m_base
声明为值Base m_base
。
另外,捕获这种错误的一种方法是让编译器警告未使用的参数。 gcc标志为-Wunused-parameter
或-Wextra -Wunused
。