我想知道std :: shared_ptr行为在将应用程序编译为win32时能按预期工作。如下所示,两个版本(win32 / x64)的源代码均相同(CLR控制台应用程序)。
#include <memory>
using namespace System;
int main(array<System::String ^> ^args)
{
// two bare pointer to an shared_ptr object
std::shared_ptr<int> *foo = new std::shared_ptr<int>();
std::shared_ptr<int> *bar = new std::shared_ptr<int>();
// create new shared_ptr which is owns an object of type integer
// reference count = (1 <= x86 / 0 <=x64)
foo = new std::shared_ptr<int>(new int(5));
// assign it to another shared_ptr instance
// reference count = (2 <= x86 / 0 <=x64)
*bar = *foo;
Console::WriteLine(L"Hello StackOverflow");
return 0;
}
在调试过程中,我添加了std :: shared_ptr实例进行观察。请参见下面的图片。
内部的第一个win32构建(/ clr)引用计数按预期方式工作,并对指向它的两个智能指针引用实例进行计数。 picture of win32 debug window
其次,内部的x64构建(/ clr)引用计数对指向它的智能指针的零个引用实例进行计数。 picture of x64 debug window
您可以在Stackoverflow中找到类似的示例作为shared_pointer包装器,以在c ++ / cli环境中使用。但是我决定使这个例子更加清晰和集中。 like this post
有没有人意识到相同的效果,我该如何解决这个问题?
[编辑]: 正如David Yaw提到要访问后面的值以防止编译器进行优化时,我添加了以下几行。
int val = **foo;
long count = (*foo).use_count();
Console::WriteLine("Value behind foo: \t{0}", val);
Console::WriteLine("\tReference count: \t{0}", count);
val = **bar;
count = (*bar).use_count();
Console::WriteLine("Value behind bar: \t{0}", val);
Console::WriteLine("\tReference count: \t{0}", count);
std :: shared_ptr后面的值以及引用计数器都是正确的。 我认为一切正常,但是在调试过程中的这种行为是令人误解的。