C++ 调用我的return方法调用我的析构函数,这会使我的程序崩溃
希望我不会把我的代码说得太多C++ 调用我的return方法调用我的析构函数,这会使我的程序崩溃,c++,C++,希望我不会把我的代码说得太多 Index::Index() : m_first(""), m_count(0) { m_ll = new LinkedList; } void TestClass::testMethod() { if (getIndex(i).getCount() != 0) { //do stuff } } Index TestClass::getIndex(int num) const { return m_index[
Index::Index() : m_first(""), m_count(0)
{
m_ll = new LinkedList;
}
void TestClass::testMethod()
{
if (getIndex(i).getCount() != 0)
{
//do stuff
}
}
Index TestClass::getIndex(int num) const
{
return m_index[num];
}
Index::~Index()
{
delete m_ll;
}
这是真正与崩溃有关的代码。当我进入testMethod时,我有m_index[num],它包含一个指向m_ll的指针。它们是完全有效的。在返回m_index[num]之后,它进入析构函数,即使m_index[num]仍在使用,因此,我的程序崩溃。我不明白为什么会这么早调用析构函数。dtor调用
delete
,getIndex
按值返回。我的水晶球告诉我,Index::Index()
调用new
,但Index::Index(Index const&)
不调用。显示更多的代码。使用所有警告和调试信息(g++-Wall-Wextra-g
)进行编译,然后使用调试器(gdb
),由getIndex
返回的索引可能会在if
条件表达式末尾被销毁。也许你想返回一个引用?也许你的复制构造函数坏了?下面是关于你的问题中应该包含哪些代码部分的一些想法:很抱歉,我没有包含Index::Index()。我刚刚加了一句,但你是对的。唯一的问题是,我根本没有复制构造函数。“我想我需要一个叫新的吗?”迈克尔·莱克:是的。这就是所谓的。简短版本。@MichaelBlake:您有一个副本<否则,code>getIndex
就不会编译。但是,它是默认的memberwise copy-ctor,它只复制指针。这意味着您将得到两个相同的索引对象,它们都将在同一指针上调用delete
。