unique_ptr всегда указывает на одну и ту же область памяти - PullRequest
1 голос
/ 23 февраля 2012

Рассмотрим этот код:

using namespace std;

int* get()
{
    unique_ptr<int> p (new int[4]);
    return p.get();
}
int main(int argc, char **argv)
{
    int *arr1=get();
    int* arr2=get();
    for(int i=0;i<4;i++)
    {
        arr1[i]=i;
        arr2[i]=i*2;
    }
    for(int i=0;i<4;i++)
        cout << arr1[i];
    return 0;
}

arr1 и arr2 указывают на одну и ту же область памяти. Таким образом, они разделяют одни и те же ценности. Я не понимаю почему, когда я вызываю arr2 = get ():

unique_ptr<int> p (new int[4]);

Этот объект не должен быть создан снова? Это не удалено, потому что все еще достижимо arr1. Как получить два массива разных областей памяти?

Ответы [ 2 ]

5 голосов
/ 23 февраля 2012

Я вполне уверен, что вы играете с неопределенным поведением, что плохо.

данные, на которые указывают, были уничтожены при уничтожении уникального указателя, тот факт, что значения совпадают, и тот же слот былвыбрано - удача.

для указателей на тип массива используйте вектор

std::vector<int> get()
{
    return std::vector<int>(4);
}

int main()
{ 
    std::vector<int> arr1=get();
    std::vector<int> arr2=get();
    return 0;
}

для обычных указателей с одним значением, затем вы можете вернуть unique_ptr;

std::unique_ptr<int> get(){
    return std::unique_ptr<int>(new int(0));
}
:::
std::unique_ptr<int> ptr=get();
0 голосов
/ 23 февраля 2012

При использовании интеллектуальных указателей происходит утечка памяти. unique_ptr будет использовать оператор delete для освобождения выделенной памяти, но вам нужно удалить []. Также возвращаемое значение функции get будет недействительным ptr, потому что unique_ptr освободит выделенную область. Если вам нужны динамически размещаемые массивы, используйте std :: vector.

...