вернуть локальную структуру, имеющую член массива - PullRequest
0 голосов
/ 24 мая 2019

Я прочитал Как вернуть локальный массив из функции C / C ++? тема и запутался в последнем блоке кода:

#include <iostream> 
using namespace std; 

struct arrWrap { 
    int arr[100]; 
  ~arrWrap()
  {

  }
}; 

struct arrWrap fun() 
{ 
    struct arrWrap x; 

    x.arr[0] = 10; 
    x.arr[1] = 20; 

    return x; 
} 

int main() 
{ 
    struct arrWrap x = fun(); 
    cout << x.arr[0] << " " << x.arr[1]; 
    return 0; 
} 

по моей идее, это будетбыть в порядке, только если конструктор по умолчанию не уничтожает член arr после завершения функции и возврата. Это правда?если это правда, то по-моему это утечка памяти, не так ли?Может ли кто-нибудь проанализировать это для меня во всех измерениях?

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Членство в классах - это единственный раз, когда массив можно скопировать одним махом, как это.

(На самом деле, именно так std::array работает! Просто оборачивая массив C в класс.)

Это безопасно, это нормально.Когда объект arrWrap копируется, то будет и массив, который он инкапсулирует.

Нет динамического выделения и утечки памяти.Даже если это не так, значит, копия не произошла, и у вас была какая-то свисающая ссылка, возможность увидеть старые значения не обязательно будет свидетельством утечки памяти .

0 голосов
/ 24 мая 2019

, если конструктор по умолчанию не уничтожает член arr

, если конструктор по умолчанию не уничтожает член arr после завершения функции и возврата. Это правда?

если это так, то в моей идее это утечка памяти, а не?

Утечка памяти происходит, когда указатель на динамически размещенный объект теряется без удаления выделения.Ваш пример не содержит динамического выделения, поэтому в нем не может быть утечки памяти.

...