gpt4 book ai didi

c++ - 赋值给 C++ 中不存在的对象

转载 作者:行者123 更新时间:2023-12-02 09:50:53 27 4
gpt4 key购买 nike

分配给没有分配对象的内存是否合法?我在 [expr.ass]/2 中这样问它说:

In simple assignment (=), the object referred to by the left operand is modified ([defns.access]) by replacing its value with the result of the right operand.



结合 [defns.access]似乎暗示左操作数应该引用一个实际的对象。一个可能触发这种情况的例子是分配原始内存而不分配任何对象,然后分配给它:

int * foo = static_cast<int *>(::operator new(sizeof(int)));
*foo = 5;

这看起来很自然,但我觉得基于这组定义,如果不首先调用placement new 例如在分配的内存上分配对象,它可能是非法的。此外,如果没有实际 int,我不确定该类型转换是否有效。对象已经在那里创建了,所以这也可能是那个例子的问题。

同样,通过像这样的“虚构”对象表示来执行此操作是否有效:

void * foo = ::operator new(sizeof(int));
int bar = 5;
std::memcpy(foo, &bar, sizeof(int));

这似乎是可能的,但基于 [basic.types]/3正如它所说:

For any trivially copyable type T, if two pointers to T point to distinct T objects obj1 and obj2, where neither obj1 nor obj2 is a potentially-overlapping subobject, if the underlying bytes ([intro.memory]) making up obj1 are copied into obj2, obj2 shall subsequently hold the same value as obj1.



这似乎意味着目的地仍然需要是一个实际分配的对象,而且这也不起作用。

我想如果这些例子都不是有效的,那么最后的困惑是 std::memset 之类的东西是怎么回事?工作?大概它也在做同样的事情,取出没有任何内容的空内存,然后通过一些任意对象表示来解释它以分配给它。事实上,C11 标准对此做了如下说明:

The memset function copies the value of c (converted to an unsigned char) into each of the first n characters of the object pointed to by s.



这表明目的地中必须有一个对象( s )已经存在。根据我的理解,在 C 的上下文中,当像 void * 这样的东西时创建一个对象。指向空内存的指针被转换为另一种类型的指针并被访问,所以不会 memset在 C 中创建一堆 char如果转换为 float *,稍后将错误地别名为另一种类型的对象?我认为这可能只是 C 对象创建在其自身标准中的工作方式在这方面被打破的问题。我还假设 C++ 中的答案是“首先放置新的所有内容”,但是在处理此类基本问题时,很难判断标准的复杂程度。

最佳答案

形式上,当没有对象时,“一生”这个词本身就没有意义。

[intro.object/1]: The constructs in a C++ program create, destroy, refer to, access, and manipulate objects. An object is created by a definition, by a new-expression, when implicitly changing the active member of a union, or when a temporary object is created ([conv.rval], [class.temporary]). An object occupies a region of storage in its period of construction ([class.cdtor]), throughout its lifetime, and in its period of destruction ([class.cdtor]).



请注意,您提供的示例使用 全局新运营商 ,而不是 新表达式 .因此,您还没有创建任何对象,更不用说它的生命周期了。你不能 memcpy ,因为没有对象。

关于c++ - 赋值给 C++ 中不存在的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59571631/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com