C++中如何访问堆分配vector的内存?代码报错求解决
问题:C++代码中vector部分报错,无法输出元素值
以下代码中数组部分运行正常,但vector部分报错,如何修改让vector部分输出500?
#include <iostream> #include <vector> using std::vector; #define log(x) std::cout << x << "\n" int main() { // array { int* array = new int[1]; array[0] = 400; log( array[0] << "\nArray\n" ); delete array; } // vector { vector<int>* vec = new vector<int>(); vec->push_back( 500 ); log ( vec[0] << "\nVector"); delete vec; } return 0; }
错误原因
vec是指向单个vector<int>对象的指针,并非指针数组。vec[0]等价于*vec,直接对vector对象使用<<会触发编译错误(没有匹配的ostream重载),且代码里的vec[0] << "\nVector"属于非法操作,试图将字符串插入vector,这是不允许的。- 要访问vector中的元素,必须先解引用指针得到vector对象,再通过下标或
at()方法访问元素。
修正方案
修改vector部分的输出语句,先解引用指针获取vector对象,再访问其第一个元素,以下三种写法都可行:
写法1:解引用后用下标访问
// vector { vector<int>* vec = new vector<int>(); vec->push_back( 500 ); log( (*vec)[0] << "\nVector"); delete vec; }
写法2:直接调用vector的operator[]
log( vec->operator[](0) << "\nVector");
写法3:使用更安全的at()方法(越界会抛出异常)
log( vec->at(0) << "\nVector");
另外补充:数组部分的delete array存在内存泄漏隐患,因为是用new[]分配的数组,应该使用delete[] array来释放内存。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

