Я использую библиотеку, которая для создания некоторого объекта, который я использую, ожидает необработанный указатель на объект. Я не уверен, что он будет делать с указателем, чтобы сделать мой код максимально безопасным, что я должен передать этой функции?
- Используйте уникальный указатель — если они решат удалить указатель, я сделаю двойное удаление
- Следите за необработанным указателем - плохо, потому что я должен помнить, чтобы написать удаление, но это все еще может быть двойное удаление
- Используйте автоматическую продолжительность и дайте им указатель
Дайте им ссылку— их код выдаст ошибку, если они вызовут удаление - Используйте общий указатель - та же проблема двойного удаления, что и уникальный указатель, но теперь моя область не повредит их указателю
Судя по моему чтению, вариант 3 похож на то, что я должен сделать - они не должны вызывать удаление для указателя, и этот формат обеспечивает это. Но что, если я не знаю, вызовут ли они сейчас или в будущем удаление по ссылке, которую я им дал? Использовать общий указатель и сказать, что я не виноват в двойном удалении?
#include <memory>
#include <iostream>
class ComplexObj {
public:
ComplexObj() : m_field(0) {}
ComplexObj(int data) : m_field(data) {}
void print() { std::cout << m_field << std::endl; }
private:
int m_field;
};
class BlackBox {
public:
BlackBox(ComplexObj* data) {
m_field = *data;
// Do other things I guess...
delete data;
std::cout << "Construction complete" << std::endl;
}
void print_data() { m_field.print(); }
private:
ComplexObj m_field;
};
int main(int argc, char* argv[]) {
// Use a smart pointer
std::unique_ptr<ComplexObj> my_ptr(new ComplexObj(1));
BlackBox obj1 = BlackBox(my_ptr.get());
obj1.print_data();
my_ptr->print(); // Bad data, since BlackBox free'd
// double delete when my_ptr goes out of scope
// Manually manage the memory
ComplexObj* manual = new ComplexObj(2);
BlackBox obj2 = BlackBox(manual);
obj2.print_data();
manual->print(); // Bad data, since BlackBox free'd
delete manual; // Pair new and delete, but this is a double delete
// Edit: use auto-duration and give them a pointer
ComplexObj by_ref(3);
BlackBox obj3 = BlackBox(&by_ref); // they can't call delete on the pointer they have
obj3.print_data();
by_ref.print();
// Use a shared pointer
std::shared_ptr<ComplexObj> our_ptr(new ComplexObj(4));
BlackBox obj4 = BlackBox(our_ptr.get());
obj4.print_data();
our_ptr->print(); // Bad data, they have free'd
// double delete when our_ptr goes out of scope
return 0;
}
Другие вопросы, которые я прочитал, связанные с этой темой...
BlackBox obj3 = BlackBox(&by_ref);
&ref
это не ссылка, а берется адресref
. - person churill   schedule 08.01.2021