我有一段相当简单的测试代码:
#include <stdio.h>
class PG
{
public:
PG(){
m_ptr = new int;
printf("Created PG %i\n", (int)m_ptr);
}
~PG(){
printf("Deleted PG %i\n", (int)m_ptr);
delete (m_ptr);
}
PG& operator =(const PG& src)
{
printf("Copied PG %i %i\n", (int)m_ptr, (int)src.m_ptr);
return(*this);
}
private:
int * m_ptr;
};
PG CreatePG()
{
PG ret;
return ret;
}
int main(int argc, char* argv[])
{
PG test;
test = CreatePG();
printf("Ending\n");
return 0;
}
如果我用 GCC、VS2008 或 VS2012 编译它并进行完全优化并运行它,我会得到我所期望的:
Created PG 7837600 -created test
Created PG 7689464 -created ret
Copied PG 7837600 768946 -copied ret to test
Deleted PG 7689464 -deleted ret
结束
已删除 PG 7837600 - 已删除测试
但是,当我在没有优化的情况下在 VS2008 或 VS2012 上编译时,我得到了这个:
Created PG 3888456 -created test
Created PG 4036144 -created ret
Deleted PG 4036144 -deleted ret。等等,我们还没有复制它!
已复制 PG 3888456 4036144 -我们现在正在尝试复制已删除的数据
已删除 PG 4036144 -这已被删除。应用程序崩溃
我不敢相信这是 VS 中从未修复过的错误,但我也看不出我做错了什么。在我的应用程序中,我有一个实例,在编译一个针对速度优化的更复杂的类时也会发生这种行为。我知道使用它会更有效:
PG test = CreatePG();
但是我仍然遇到类似的问题,尽管在这种情况下显然使用了复制省略:
Created PG 11228488
Deleted PG 11228488
Ending
Deleted PG 11228488
我仍然得到双重删除。
如果有人能对此有所了解,我将不胜感激。