【发布时间】:2021-10-16 18:54:32
【问题描述】:
我正在学习 C++,我想知道是否有人可以解释我看到的一些奇怪行为。
我目前正在学习内存管理,并且一直在使用以下代码:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// pass back by pointer (old C++)
const int array_size = 1e6; // determines size of the random number array
vector<int> *RandomNumbers1()
{
vector<int> *random_numbers = new vector<int>[array_size]; // allocate memory on the heap...
for (int i = 0; i < array_size; i++)
{
int b = rand();
(*random_numbers).push_back(b); // ...and fill it with random numbers
}
return random_numbers; // return pointer to heap memory
}
int main (){
vector<int> *random_numbers = RandomNumbers1();
for (int i = 0; i < (*random_numbers).size(); i++){
cout << (*random_numbers)[i] + "\n";
}
delete random_numbers;
}
我要做的是通过调用RandomNumbers1() 函数获取指向包含随机整数的向量的指针,然后在新行上打印每个随机数。
但是,当我运行上述代码时,我得到的不是随机数,而是各种随机信息。似乎代码正在访问内存中的随机位置并打印出内容。
现在我知道我在这里做了一些愚蠢的事情——我有一个int,我正在向它添加字符串"\n"。如果我将main() 中的代码更改为以下内容,则可以正常工作:
int main (){
vector<int> *random_numbers = RandomNumbers1();
for (int i = 0; i < (*random_numbers).size(); i++){
cout << to_string((*random_numbers)[i]) + "\n";
}
}
但是,我无法理解使用“错误”代码的行为 - 即如何将字符串 "\n" 添加到 (*random_numbers)[i]
导致程序访问内存的随机区域,而不是我的指针指向的位置。当然,在“添加”"\n" 之前,我已经取消引用了指针并访问了位置i 的元素?那么程序是如何访问完全不同的内存地址的呢?
【问题讨论】:
-
提示:您可以使用
->取消引用指针,而不是使用(*ptr).func()。只需写:ptr->func() -
new vector<int>[array_size];创建一个向量数组,但您可能根本不想动态分配一个向量... -
不相关,但您的意思是只使用您分配的
vectors 之一吗?除了一个之外,所有的都是空的。另外,您需要使用delete[],因为您使用了new[]。
标签: c++ pointers memory-management