std::vector
jest w standardzie od jego pierwszej wersji z 1998 roku (a i przed standaryzacją nie był nowością). Jeśli masz zakaz użycia jego, to pewnie też odpada boost::scoped_ptr
/boost::shared_ptr
z biblioteki Boost. W takim razie masz 2 opcje:
- Po prostu usuń dane za pomocą
delete[]
w miejscu, w którym przestajesz ich używać. Pamiętaj, że jak masz więcej instrukcji return
lub cokolwiek w środku może rzucić wyjątek to musisz to wziąć pod uwagę
- Napisz własny scoped/shared pointer, to nie jest trudne dla podstawowego przypadku.
Ad.1
Np mając dwie ścieżki wyjścia z funkcji:
void foo()
{
int* ptr = funkcja();
if(ptr[0] == 42){
delete[] ptr;
bar();
return;
}
qux(ptr);
delete[] ptr;
baz(ptr);
return;
}
problem z nagimi wskaźnikami jest taki, że nie masz pojęcia czy qux()
przejmuje kontrolę nad wskaźnikiem (t.j. czy zwalnia pamięć) oraz jeśli qux()
rzuci wyjątek, to pamięć pod ptr
nie zostanie zwolniona, więc finalnie ta funkcja powinna wyglądać tak:
void foo()
{
int* ptr = funkcja();
if(ptr[0] == 42){
delete[] ptr;
bar();
return;
}
try{
qux(ptr);
delete[] ptr;
baz();
}catch(std::exception const& e){
delete[] ptr;
log(e.what());
}
return;
}