Проблема заключается в том, что buffer
живет в стеке и выходит за пределы области действия с момента выхода recvmsg
.
Вы можете выделить buffer
в куче:
char *recvmsg(){
char *buffer = malloc(1024);
return buffer;
}
] Обратите внимание, что теперь вызывающий абонент отвечает за распоряжение выделенной памятью:
void main(){
char *reply = recvmsg();
free(reply);
}
«Время жизни» объекта имеет значение для потребителей объекта, а не самого объекта. Поэтому потребительский класс не должен пытаться получить доступ к элементам объекта после начала уничтожения.
Если время жизни заканчивается до начала деструктора, не означает ли это, что доступ к членам в деструкторе является неопределенным поведением?
blockquote>Надеюсь, нет:
От N3242 Конструкция и уничтожение [class.cdtor] / 3
Чтобы сформировать указатель на (или получить доступ к значению) прямой нестатический член объекта obj, построение obj должно и его уничтожение не будет завершено, в противном случае вычисление значения указателя (или доступа к значению члена) приведет к неопределенному поведению.
blockquote>
«Lifetime» не означает этого. Это точно определенный термин в стандарте, который имеет множество последствий, но он может не иметь всех последствий, которые вы могли бы подумать. Члены могут по-прежнему использоваться во время строительства и уничтожения, внешний код может вызывать функции-члены и т. Д. И т. Д.
. Конечно, для клиентского кода немного странно вызывать функции-члены одновременно с деструктором, но не неслыханно и, конечно же, не запрещается языком. В частности, std::condition_variable
явно разрешает вызов деструктора, пока есть нерешенные вызовы condition_variable::wait()
. Он запрещает новые вызовы wait()
после запуска деструктора.
Нет, нет проблем:
Объекты-члены оживают до того, как тело конструктора запускается, и они остаются в живых до тех пор, пока не закончится деструктор. Поэтому вы можете ссылаться на объекты-члены в конструкторе и деструкторе.
Сам объект не оживает до тех пор, пока его собственный конструктор не завершится, и он умрет, как только его деструктор начинает выполнение. Но это касается только внешнего мира. Конструкторы и деструкторы могут по-прежнему ссылаться на объекты-члены.
constructor() { outside_function(this); }
(может также быть деструктором)
– Pubby
23 December 2011 в 04:11
this
в конструкторе и деструкторе, поскольку он не указывает на живой объект. В принципе, «не использовать» & quot; применяется. Хранение указателя в порядке, но ссылаться на потенциальный объект - нет.
– Kerrek SB
23 December 2011 в 04:16
this
(при условии, что он неявно добавлен)? constructor() { this->x = 0; this->mfun(); }
– Pubby
23 December 2011 в 04:19
this
", если хотите). То, что конструктор не должен делать, это вызвать внешнюю функцию foo(*this)
, которая ожидает объект (полностью построенный).
– Kerrek SB
23 December 2011 в 12:16