Будет ли это вне сферы действия и не будет функционировать должным образом? - PullRequest
2 голосов
/ 22 апреля 2009

Я объявляю структуру внутри своего кода, а затем пытаюсь вставить ее в структуру данных, которую я написал. Однако я обеспокоен тем, что, поскольку я объявляю структуру внутри функции, после завершения функции структура данных будет указывать на мусор. Кто-нибудь может помочь с этим?

Вот код:

 void Class::function()
 {
  // do some stuff
  node newNode;
  newNode.memAddr = tempNode.memAddr+totalSize;
  newNode.size = tempNode.size-totalSize;
  lists[newNode.size>=512?64:(newNode.size>>3)].insert(&newNode);
 }

Edit: на самом деле я пытаюсь переписать malloc, поэтому вызов malloc () или new не будет работать здесь. Есть ли способ, которым я мог бы переместить этот код в метод вставки, а затем заставить его работать так, чтобы он не выпал из области видимости при вставке?

Ответы [ 6 ]

3 голосов
/ 22 апреля 2009

Это будет вне области видимости после возврата функции, да. Это не верно. Вы хотите разместить его в куче.

Редактировать: Конечно, если вы не скопируете память, на которую вы указываете, во вставке.

1 голос
/ 22 апреля 2009

newNode будет вне области, и его адрес будет указывать на мусор (как отметил jfclavette.)

Но, если случайно ... 1003 *

 lists[newNode.size>=512?64:(newNode.size>>3)].insert(&newNode)

реализовано для copy newNode, тогда данные в этой копии будут вероятно в порядке, основываясь на ограниченном фрагменте кода, который вы опубликовали.

1 голос
/ 22 апреля 2009

Это почти наверняка приведет к ошибке. Проблема в том, что вы передаете адрес значению в стеке списку, который будет жить за пределами этого значения. Если в списке хранятся типы node*, это будет неверно.

Чтобы это заработало, вам нужно выполнить одно из следующих действий:

  1. Вместо node*.
  2. Выделите node* в куче перед передачей. Это означает, что вам придется освободить его позже.
0 голосов
/ 22 апреля 2009

Почему вы пытаетесь реализовать malloc? Если вы не пишете операционную систему, вы, вероятно, не хотите этого делать. В конечном счете, вам нужно вызвать функции кучи ОС, которые Malloc делает для вас. Если вы просто хотите больше контроля над тем, как все распределяется, посмотрите на Place New .

0 голосов
/ 22 апреля 2009

Для ответа на редактирование: нет.

0 голосов
/ 22 апреля 2009

Как уже отмечали другие, это приведет к сохранению указателя, который будет указывать на стек. Стек очень занят, очень вероятно, что он очень быстро укажет на то, о чем вы будете беспокоиться, поэтому вы обнаружите проблему во время выполнения довольно быстро.

Лучше разместить его в куче (используя new) и освободить его в другое время.

Редактировать: удалено примечание, что «Ваш компилятор должен был предупредить вас о получении адреса выделенного стека объекта (& newNode)». Ваш компилятор предупредит вас, если вы попытаетесь вернуть ссылку на объект стека, но не если вы просто попытаетесь получить указатель.

...