Когда у меня есть функция:Передача сырой указатель на функцию с shared_ptr
void foo(std::shared_ptr<T> a, std::shared_ptr<T> b);
есть шанс, утечки памяти при вызове его так:
foo(new T(), new T());
Когда у меня есть функция:Передача сырой указатель на функцию с shared_ptr
void foo(std::shared_ptr<T> a, std::shared_ptr<T> b);
есть шанс, утечки памяти при вызове его так:
foo(new T(), new T());
Это не будет компилироваться, так как преобразование в shared_ptr
является явным. Если бы я наивно исправил это:
foo(std::shared_ptr<T>(new T()), std::shared_ptr<T>(new T())); // don't do this
тогда действительно есть вероятность утечки памяти. Один разрешается порядок оценки является:
T * p1 = new T();
T * p2 = new T();
std::shared_ptr<T> s1(p1);
std::shared_ptr<T> s2(p2);
foo(s1,s2);
Если второй new
выбрасывает исключение, то первый объект будет просочилась. Чтобы исправить это, убедитесь, что первый общий указатель инициализируется перед попыткой второго выделения, либо с временной переменной:
std::shared_ptr<T> a(new T());
std::shared_ptr<T> b(new T());
foo(a,b);
или вызов функции для инициализации каждого
foo(std::make_shared<T>(), std::make_shared<T>());
Да, не компилируется. Это «перевод» из кода с другой реализацией интеллектуального указателя, у которого не было явно выраженного конструктора. Но в любом случае дело было в определении порядка оценки. – Anton
Как сказал @ Mike, ваш источник не будет компилироваться. Вам необходимо явное построение shared_ptr
, таких как:
foo(std::shared_ptr<T>(new T()), std::shared_ptr<T>(new T()));
Это по-прежнему небезопасно. В выражениях C++ выражения, используемые в качестве аргументов функции, обычно могут быть оценены в любом порядке, включая чередование, за исключением случаев, когда другие правила ограничены.
Для одного примера, заказ может быть:
И если сбой (3) или (4) не выполнен (путем метания), объект, построенный на этапе (2), не будет разрушен, а память, выделенная на этапе (1), будет протекать.
Он не может бросить, потому что он не будет компилироваться. Так что ты в безопасности. – juanchopanza