Было установлено (см. ниже) размещение new
требуется для создания объектов
int* p = (int*)malloc(sizeof(int));
*p = 42; // illegal, there isn't an int
Однако это довольно стандартный способ создания объектов в C.
Вопрос в том, существует ли int
, если он создан в C и возвращается в С++?
Иными словами, гарантируется ли законность? Предположим, что int
одинаково для C и С++.
foo.h
#ifdef __cplusplus
extern "C" {
#endif
int* foo(void);
#ifdef __cplusplus
}
#endif
foo.c
#include "foo.h"
#include <stdlib.h>
int* foo(void) {
return malloc(sizeof(int));
}
main.cpp
#include "foo.h"
#include<cstdlib>
int main() {
int* p = foo();
*p = 42;
std::free(p);
}
Ссылки на обсуждения обязательного характера размещения new
:
- Является ли размещение новым юридически необходимым для помещения int в массив char?
- qaru.site/info/24207/...
- https://groups.google.com/a/isocpp.org/forum/#!msg/std-discussion/rt2ivJnc4hg/Lr541AYgCQAJ
- https://www.reddit.com/r/cpp/comments/5fk3wn/undefined_behavior_with_reinterpret_cast/dal28n0/
- reinterpret_cast, создающий тривиальный конструктивный объект по умолчанию