小编fdg*_*dfg的帖子

强制复制省略?gcc 5.4.1

我目前正在努力使用c ++和copy elision,特别是"命名返回值优化"(NRVO),以便能够实现工厂功能模式.我不能在不同的编译器中获得一致的行为.我的妈妈:

#include <iostream>
struct base {
  virtual ~base() { std::cout << "dtor base\n"; }
};
struct derived : public base {
  ~derived() { std::cout << "dtor derived\n"; }
};
derived f() { return derived(); }
int main(int argc, char *argv[]) {
  std::cout << "start\n";
  new derived(f());
  std::cout << "done. should have leaked!\n";
}
Run Code Online (Sandbox Code Playgroud)

注意:删除虚拟base-dtor可以解决问题,但我需要它才能实现真正的实现.

如果是gcc 5.4.0,则调用dtor,不执行复制省略:

$ g++ test2.cpp && ./a.out
start
dtor derived
dtor base
done. should have leaked!
Run Code Online (Sandbox Code Playgroud)

当使用gcc 5.4.1(Ubuntu称之为5.4.1,我认为这是svn-head)时,我可以接触到的所有clang以及各种其他gcc执行elision并成功泄漏内存:

$ g++ test2.cpp  && …
Run Code Online (Sandbox Code Playgroud)

c++ gcc c++11

1
推荐指数
1
解决办法
525
查看次数

标签 统计

c++ ×1

c++11 ×1

gcc ×1