Что может пойти не так в следующем сценарии? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть struct определение следующим образом:

typedef struct {
  UINT   idLength;
  UINT * ids;
} AsnObjectIdentifier;

У меня есть функция, у которой есть переменная, выделенная в стеке вышеупомянутой структуры, и я передаю эту переменную как ссылку на какую-то другую функцию для заполнения значенийв нем.

void someFunc() {
  //code
  AsnObjectIdentifier temp;    //this is a stack allocated variable
  someOtherFunc(temp);
}

В функции, которая заполняет вышеприведенную переменную стека, я создаю массив с выделенной кучей UINT и присваиваю его ids.

void someOtherFunc(AsnObjectIdentifier& oidVar) {
  //code
  UINT* arr = new UINT[someSize];     //this is a heap allocated variable
  oidVar.ids = arr;
  //some other code
}

КогдаЯ возвращаюсь к вызывающей функции. У меня есть переменная стека, которая внутри содержит переменную, выделенную для кучи.

Я что-то не так делаю?Я играю с двумя мирами разных воспоминаний?Может ли это привести к проблемам?

Также, если в someFunc() я создаю новую переменную AsnObjectIdentifier и выделяю для нее память, используя malloc, могу ли я присвоить массив UINT из выделенной переменной стекаэтой новой куче выделена AsnObjectIdentifier переменная?Будут ли с этим проблемы?

1 Ответ

0 голосов
/ 26 сентября 2019

Я что-то не так делаю?

Да, я бы сказал Право собственности - это проблема.Из того, что вы показали, право собственности неясно, и неясно, кто должен удалять arr (и как они узнают, что они должны использовать delete[]).

По этой причине общепринятый смыслнеобработанный указатель (в c++, а не в c) обычно «не принадлежит».

В вашем примере, простой способ, вероятно, просто использовать std::vector<UINT> вместо AsnObjectIdentifier struct.

Играю ли я с двумя мирами разных воспоминаний?Может ли это привести к проблемам?

Это не похоже на это, но вам следует держаться подальше от ручного управления памятью .new[] или в крайнем случае даже любой вид new или выделение памяти - это признак того, что вы катитесь вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...