У меня есть следующий код, который я хочу переписать, чтобы использовать умные указатели:
Я изо всех сил пытаюсь найти какие-либо достойные примеры того, как объявить, выделить память и получить доступ к двойному указателю. Кто-нибудь может привести пример? Я читал, что shared_ptr — это не тот путь, потому что он использует delete вместо delete [], нужно ли использовать shared_array?
#include <iostream>
#include <boost/shared_array.hpp>
#include <iomanip>
int main(int argc, char**argv) {
std::pair<int,float> **corrArray;
int rows=10;
int cols=5;
corrArray = new std::pair<int,float>*[rows];
for(int i=0; i<rows; i++) {
corrArray[i] = new std::pair<int,float>[cols];
}
for(int i=0; i<rows; i++) {
for(int j=0; j<cols; j++) {
corrArray[i][j].first = i+j;
std::cout << std::setw(3) << corrArray[i][j].first << " ";
}
std::cout << "\n";
}
for(int i=0; i<rows; i++) {
delete[] corrArray[i];
}
delete[] corrArray;
return 0;
}
Редактировать: corrArray должен быть объявлен первым (это будет член класса)
Boost shared_ptr уже работает с массивами:
http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/shared_ptr.htm
Начиная с Boost версии 1.53, shared_ptr может использоваться для хранения указателя на динамически размещенный массив.
shared_ptr<double[1024]> p1( new double(1024) );
shared_ptr<double[]> p2( new double(n) );
Boost shared_ptr является частью C ++ 11 (так что вы также можете использовать их):
std::unique_ptr<int[]> my_array(new int[5]);
Еще лучше, используйте vector, потому что вы не делитесь им вообще:
std::vector<std::vector<std::pair<int,float>>> corrArray;
Других решений пока нет …