【发布时间】:2013-10-24 19:40:06
【问题描述】:
我有一段相当简单的测试代码:
#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 编译并运行它并运行它,我得到的正是我所期望的:
创建 PG 7837600 -创建测试
已创建 PG 7689464 -已创建 ret
复制 PG 7837600 768946 -复制 ret 进行测试
已删除 PG 7689464 -已删除 ret
结局
已删除 PG 7837600 -已删除测试
但是,当我在没有优化的情况下在 VS2008 或 VS2012 上编译时,我得到了这个:
创建 PG 3888456 -创建测试
已创建 PG 4036144 -已创建 ret
已删除 PG 4036144 -已删除 ret。等等,我们还没有复制它!
已复制 PG 3888456 4036144 -我们现在正在尝试复制已删除的数据
已删除 PG 4036144 -这已被删除。应用程序崩溃
我不敢相信这是 VS 中从未修复过的错误,但我也看不出我做错了什么。在我的应用程序中,我有一个实例,在编译针对速度优化的更复杂的类时也会发生这种行为。我知道使用起来会更有效率:
PG test = CreatePG();
但我仍然遇到类似的问题,尽管在这种情况下显然使用了复制省略:
创建 PG 11228488
已删除 PG 11228488
结局
已删除 PG 11228488
我仍然收到双重删除。
如果有人能对此有所了解,我将不胜感激。
【问题讨论】:
-
您需要提供带有检测功能的复制构造函数。
-
你的
operator =没有做任何事情。 -
@PeteBecker 他需要提供一个拷贝构造函数,句号。否则,他会被双重删除。
-
@JamesKanze - 没有检测的复制构造函数将无法提供准确的跟踪。
-
谢谢。这正是我一直在寻找的。我非常关注优化和非优化之间的不同行为,以至于我完全忽略了这一点。
标签: c++ visual-studio object visual-studio-2012 return