Счетчик ссылок std :: shared_ptr работает только на конкретной платформенной архитектуре c ++ / cli - PullRequest
0 голосов
/ 25 сентября 2018

Мне было интересно узнать о поведении 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) подсчет ссылок внутри действует как ожидалось и подсчитывает два упомянутых экземпляра умного указателя, указывающего на него. изображение окна отладки win32

Во-вторых, x64 build (/ clr) Счетчик ссылок внутри подсчитывает ноль упомянутых экземпляров умного указателя, указывающего на него. изображение окна отладки x64

В Stackoverflow вы можете найти похожие примеры в качестве оболочки shared_pointer для использования в среде c ++ / cli.Но я решил сделать этот пример более понятным и целенаправленным. как этот пост

Кто-нибудь узнал тот же эффект и как я мог попытаться решить эту проблему?

[Редактировать]: Как сказал Дэвид Йо, чтобы получить доступ к значениямЧтобы предотвратить оптимизацию компилятора, я добавил следующие строки:

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 является правильным, а также счетчик ссылок.Я предполагаю, что все в порядке, но это поведение во время отладки вводит в заблуждение.

Вывод показан здесь. изображение окна отладки x64 после первого редактирования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...