何时是"replaced"不再可寻址的变量
When is a variable that is "replaced" no longer addressable
如果我将新变量分配给旧变量,旧变量将不再可寻址,但我不确定它何时超出范围:
例如:
std::vector<int> foo() {
return std::vector<int>{3,4,5};
}
int main() {
std::vector<int> v{1,2,3};
v = foo(); //when is the first vectors destructor called?
//before or after "foo()" has been called?
//is it called?
}
而且,如果直到调用foo之后才调用它,那么在调用foo((之前如何销毁v?
v = foo();
上面的语句是一个移动赋值(复制赋值适用于C++11之前的编译器(。在任何一种情况下,调用foo()
的结果都是赋值所必需的,因为它是相应赋值运算符的输入参数,所以在调用foo()
之后释放v
管理的资源,并且在复制/移动赋值运算符中执行内存管理。
注意,我没有提到对v
的析构函数的任何调用,因为那时不会调用析构函数。v
管理的内存将被解除分配,同时调用各个元素的析构函数。在vector<int>
的情况下,每个int
的析构函数都是NOP,所以它们只是在概念上调用的。
然后,vector
将分配足够的内存,以便能够保存foo
返回的vector
的内容(复制分配(,或者控制由foo
返回的vector
管理的内存(移动分配(。当然,如果现有内存足够大,可以容纳新内容,那么vector
实现可以自由跳过先释放后分配。
当v
超出作用域时,v
的析构函数将运行。在您提供的示例中,这种情况发生在main()
的末尾。
foo()
的返回值是在将其分配给main()
中的v
之前创建的。
当析构函数超出作用域时,即在main的末尾调用析构函数。
序列是调用foo((,它返回一个向量。然后调用一个复制赋值操作符,将返回的向量复制到原始向量。然后,返回的向量被销毁,因为它是一个临时变量。
v
只有在超出范围时才会被销毁。
然而,foo()
创建一个临时对象,然后返回该对象,然后将其分配给v
。然后销毁临时文件(在将其分配给v
之后(。CCD_ 24然后在CCD_。
请注意,在实践中,编译器优化了很多这方面的内容——它确实返回值优化,这样它就不会返回一个临时的,然后分配给v
,而是直接在v
上工作。此外,还有一个移动分配操作符,它将内存的所有权从临时交换到v
,而不需要先复制它。
- 从结构寻址时,MMAP变量的行为很奇怪
- 字节真的是最小可寻址单元吗
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- imread() 仍然返回空垫子,尽管在 openCV 4.0.0 中寻址正确
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 如何像在 C++ 中处理数组一样对 .txt 文件中的字符进行寻址?
- C++11右值引用寻址
- 对堆栈增长和寻址的困惑
- C++ std::find() 寻址返回向量的类函数时的意外行为
- 间接寻址运算符如何返回带有运算符重载的指针地址
- Adafruit NeoPixel库在寻址超过7个LED灯条时不起作用
- 在模板 SFINAE 约束中使用间接寻址级别会导致硬错误
- 错误:使用索引寻址和 Clang 的指令的操作数无效
- 是否可以寻址另一个网络中的服务器/客户端套接字?(C++)
- C++中的字节寻址算法
- 指针声明和间接寻址之间的区别
- 仅在使用间接寻址时调用虚函数 — 经典的早期绑定问题?
- c++检查变量以寻址越界
- 变量寻址
- 何时是"replaced"不再可寻址的变量