O que é um smart pointer e quando deve ser usado?
Olá a todos! Comecei a estudar C++ recentemente e constantemente enfrento problemas ao trabalhar com memória. Especialmente me assustam os vazamentos de memória e os dangling pointers. Por exemplo, frequentemente escrevo código assim:
```cpp
class MyClass {
public:
int* data;
MyClass() {
data = new int(42);
}
~MyClass() {
delete data;
}
};
void example() {
MyClass* obj = new MyClass();
// ... algum código que pode lançar uma exceção
delete obj;
}
```
O problema é que se entre `new` e `delete` ocorrer uma exceção, ou se eu esquecer de chamar `delete`, a memória vaza. E se alguém deletar o objeto antes do tempo, e eu continuar usando — o programa quebra.
Ouvi dizer que no C++11 surgiram os "smart pointers", que devem resolver esses problemas. Mas não entendo como eles funcionam e quando aplicá-los. Qual é a diferença entre `unique_ptr`, `shared_ptr` e `weak_ptr`? É necessário ainda usar ponteiros comuns? E como corrigir