【发布时间】:2018-04-05 04:00:43
【问题描述】:
已建立(见下文)放置new 是创建对象所必需的
int* p = (int*)malloc(sizeof(int));
*p = 42; // illegal, there isn't an int
然而,这是在 C 中创建对象的一种非常标准的方式。
问题是,如果int是用C创建的,然后返回到C++,它是否存在?
换句话说,以下内容是否保证是合法的?假设 int 对于 C 和 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:
- Is placement new legally required for putting an int into a char array?
- https://stackoverflow.com/a/46841038/4832499
- 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 creating a trivially default-constructible object
【问题讨论】:
-
对于
int是的,对于任意类型,它取决于。 -
对于一个或多个原始类型的值(如
int),您可以使用malloc。或new。或new[]。你显示的malloc调用与new int完全相同。 IE。int* p = (int*) malloc(sizeof(int));和int* p = new int;相同,都分配足够的内存来存储一个int值。 -
@Someprogrammerdude 让我们暂时排除它。这当然是个问题
-
可以直接从C++程序调用malloc,不需要经过自定义的C函数。任何维护 malloc should not 足以创建 int 的人都需要被取出并枪杀。如果标准中存在使 malloc 不足以创建 int 的语言,则这是需要修复的缺陷。故事结束。
-
我是第二个@n.m.:将语言视为语言外行只能让你走这么远。最后,你必须在真机上实现这个东西,那就是你必须离开标准定义的 C 的舒适领域,进入实现定义的 C 和,喘不过气,汇编程序的领域。你看,用 100% 符合标准的 C/C++ 来实现
malloc()或::operator new()是不可能的。当您需要使用内核请求的内存来支持您的分配时,以及当您将一个释放的对象重用于其他东西(严格的别名违规!)时,这都会失败。
标签: c++ c language-lawyer object-lifetime