为啥将局部变量推回 Vectorworks

Posted

技术标签:

【中文标题】为啥将局部变量推回 Vectorworks【英文标题】:Why Does Pushing Back Local Variable to Vector Works为什么将局部变量推回 Vectorworks 【发布时间】:2019-01-24 01:58:00 【问题描述】:

C++ 向量存储指向它存储的值的指针(即整数向量将存储指向整数的指针)。在以下代码中, int i 是 for 循环中的局部变量。一旦 for 循环完成,应该从内存中删除 int i 变量。因此,向量指针应该指向内存中的一些垃圾位置。

我将此代码插入 XCode,但它会打印“30313233”——本应从内存中删除的整数。

为什么要这样做?

int main(int argc, const char * argv[]) 
std::vector<int> vec;
for(int i = 30; i < 34; i++)

    vec.push_back(i);

cout << vec[0];
cout << vec[1];
cout << vec[2];
cout << vec[3];

【问题讨论】:

【参考方案1】:

C++ 向量存储指向它所存储的值的指针

不,那不是真的。 C++ 中的对象是真正的对象,它们不像 Java 中那样隐藏引用。1

int a = 1;
int b = a;
a = 3;
assert(b == 1); // b is a distinct object

在您的示例中,您正在推回i。这意味着对象的副本将被添加到向量中,而不是变量本身。


1:从技术上讲,它确实存储了一个指针,但该指针是指向数组所在的内存块,其中存储了实际的ints。但这是您(此时)不应该担心的实现细节。

【讨论】:

所以它 (1) 制作对象的副本,然后 (2) 将指向该对象副本的指针存储在内存中? (此时)我想知道我申请实习时的完整信息 @Y.Moondhra 1) 是,2) 不是。向量有一块内存。当您使用push_back 时,向量会在该内存块中创建一个新对象,它将您传递的对象复制到正在创建的新对象中。它存储的唯一指针是指向内存块的开头(如int a[] = 1, 2; int *b = a;b 是指向数组内存块的指针)。 现在我完全明白了。谢谢。【参考方案2】:

向量存储指向存储对象的内存块的指针,而不是单个对象。当您插入向量时,对象会复制到该内存块中。

【讨论】:

给了你赞成票,但它没有显示,因为我没有足够的代表。谢谢【参考方案3】:

vector&lt;int&gt; 存储int 类型的值。 vector&lt;int*&gt; 存储int* 类型的值,即指向int 的指针。

【讨论】:

以上是关于为啥将局部变量推回 Vectorworks的主要内容,如果未能解决你的问题,请参考以下文章

为啥方法局部静态变量绑定到类而不是实例?

一次定义2个int类型局部变量,这两个局部变量的地址为啥相差12个字节?

为啥我的线程函数中的局部变量会被其他线程中断?

JS全局变量是全局对象的属性,函数局部变量为啥就不是函数的属性呢?

为啥我的函数使用局部变量而不是全局变量? [复制]

为啥尚未定义的局部范围变量引用同名的实例变量?