Pogooglowałem trochę i dowiedziałem się, że inteligentne wskaźniki mogą tak jak się spodziewałem wskazywać na tablicę, a nie tylko pojedynczą zmienną. Tylko nie jestem pewien czy faktycznie jest później zwalniana cała tablica czy tylko jedna zmienna, bo angielskojęzyczne fora mówią różnie na ten temat.
Zauważyłem, że ten kod:
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> adresy;
{
unique_ptr <int[]> ptr(new int[4]);
for(int i=0; i<4; i++)
ptr[i] = i*3;
for(int i=0; i<4; i++)
{
cout << ptr[i] << endl;
cout << (int)&ptr[i] << endl;
adresy.push_back((int)&ptr[i]);
}
for(int i=0; i<4; i++)
{
int* wsk = reinterpret_cast < int* > (adresy[i]);
cout << *wsk << endl;
}
}
for(int i=0; i<4; i++)
{
int* wsk = reinterpret_cast < int* > (adresy[i]);
cout << *wsk << endl;
}
return 0;
}
działa tak samo jak ten:
#include <memory>
#include <iostream>
#include <vector>
#include "text.h"
using namespace std;
int main()
{
vector <int> adresy;
int *ptr = new int[4];
for(int i=0; i<4; i++)
ptr[i] = i*3;
for(int i=0; i<4; i++)
{
cout << ptr[i] << endl;
cout << (int)&ptr[i] << endl;
adresy.push_back((int)&ptr[i]);
}
for(int i=0; i<4; i++)
{
int* wsk = reinterpret_cast < int* > (adresy[i]);
cout << *wsk << endl;
}
delete ptr;
for(int i=0; i<4; i++)
{
int* wsk = reinterpret_cast < int* > (adresy[i]);
cout << *wsk << endl;
}
return 0;
}
Dwie pierwsze zmienne przechowują jakieś dziwne wartości po użyciu operatora delete jawnie (II przypadek) lub po użyciu przez unique_ptr operatora delete/delete[] (nie wiem czy na pewno jest wywoływany delete[] czy delete i czy w ogóle któryś jest) a w dalszych komórkach są nadal sensowne wartości. Ktoś iwe czemu tak jest i czy mogę spokojnie używać I sposobu bez ryzyka wycieku pamięci?