use*_*124 9 c++ initializer-list visual-studio-2013
我正在测试vs2013 c ++ initializer_list.
可以编译下面的代码.但是当我运行exe时崩溃了.
#include <memory>
#include <iostream>
class Base {};
class Derived : public Base {};
void DoSomething(std::initializer_list<std::shared_ptr<Base> > list)
{
}
int main()
{
auto ip = std::make_shared<Derived>();
std::cout << "use_count=" << ip.use_count() << std::endl;
DoSomething({ip, std::make_shared<Derived>()}); // ng
// DoSomething({ip, std::make_shared<Base>()}); // ok
// DoSomething({std::make_shared<Derived>(), ip}); // ok
std::cout << "use_count=" << ip.use_count() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
编译.
C:\...>cl.exe /EHsc test.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation. All rights reserved.
/out:test.exe
test.obj
C:\...>
Run Code Online (Sandbox Code Playgroud)
我期待这样的输出.g ++ 4.8.2就是这样的.
c:\...>test.exe
use_count=1
use_count=1
Run Code Online (Sandbox Code Playgroud)
但是,看起来像这样.
c:\...>test.exe
use_count=1
use_count=0 // or some random value like 3719232 and displayed crash dialog.
Run Code Online (Sandbox Code Playgroud)
并且,修改上面代码的一行,这很好用.
DoSomething({std::make_shared<Derived>(), ip});
Run Code Online (Sandbox Code Playgroud)
这是vs2013 initializer_list的错误或正常行为吗?
这是 vs2013 初始化程序列表的错误还是正常行为?
两者皆是。VS2013的std::initializer_list实现有bug;查看类似的问题 为什么第一个元素被破坏?以及在initializer_list 与 2013 中的双重删除。
有人于 2013 年 11 月向 Microsoft 报告了其中一个问题:http://connect.microsoft.com/VisualStudio/feedback/details/807419/initializer-lists-leaking-memory
此问题现已在 Spring Update 中修复: Visual Studio 2013 Update 2 中修复的错误
| 归档时间: |
|
| 查看次数: |
1671 次 |
| 最近记录: |