Мне было интересно узнать о поведении 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 после первого редактирования