std :: shared_ptr参考计数器仅适用于特定的平台架构c ++ / cli

时间:2018-09-25 13:27:27

标签: c++-cli

我想知道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后面的值以及引用计数器都是正确的。 我认为一切正常,但是在调试过程中的这种行为是令人误解的。

此处显示输出。 picture of x64 debug window after first edit

0 个答案:

没有答案