Сброс слабого_птра влияет на shared_ptr? - PullRequest
11 голосов
/ 04 октября 2019

Я не очень привык использовать weak_ptr, и я сталкиваюсь с довольно запутанной ситуацией. Я использую Intel XE 2019 Composer update 5 ( пакет 2019.5.281 ) в сочетании с Visual Studio 2019 ver. 16.2.5 . Я компилирую в 64-битной версии. Я использую стандарт C ++ 17 .

Вот код для моего решения для всплеска:

#include <memory>
#include <iostream>

using namespace std;

int main( int argc, char* argv[] )
{
    shared_ptr<int> sp = make_shared<int>( 42 );
    cout << "*sp = " << *sp << endl;

    weak_ptr<int> wp = sp;
    cout << "*sp = " << *sp << ", *wp = " << *wp.lock() << endl;

    wp.reset();
    cout << "*sp = " << *sp << endl;

    return 0;
}

Вывод, который я ожидал получить:

*sp = 42
*sp = 42, *wp = 42
*sp = 42

... но вот что я получил:

*sp = 42
*sp = 42, *wp = 42
*sp = -572662307

Что происходит? Нормально ли для shared_ptr быть измененным / недействительным, когда / связанный weak_ptr сброшен? Я немного смущен результатами, которые я получил. Честно говоря, я не ожидал этого результата ...

РЕДАКТИРОВАТЬ 1

Хотя ошибка возникает в 64-битной конфигурации, она не в 32-разрядный . В этой более поздней конфигурации результат является ожидаемым.

EDIT 2

Ошибка возникает только в Debug . Когда я собираю Release , я получаю ожидаемый результат.

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Похоже, что это реальная ошибка на стороне Intel ICC;Я сообщил об этом.

Еще раз спасибо за помощь в определении этой проблемы.

1 голос
/ 04 октября 2019

Это похоже на ошибку в библиотеке отладки со значениями часового. Это легко проверить, используя строку, которую я упомянул:

int i = 1; cout << i << " " << ++i << endl;

Если вывод 2 2 вместо 1 2, то компиляторне соответствует и, возможно, до сих пор считает такой случай UB. В этом случае значения Sentinel могут быть ошибочно использованы с вызовом reset(). То же самое происходит с удалением объекта, созданного путем помещения нового в предварительно выделенный статический буфер, в режиме отладки он перезаписывается некоторыми реализациями со значениями часового.

...