c ++方法地址向量

时间:2014-01-29 21:44:56

标签: c++ vector

我是使用vector的新手,我需要一个返回向量的addres的方法,这是简单的代码:

类:

#include<vector>

class A
{
private:
    std::vector<int> v;
public:
    A()
    {
        for (int i = 0; i < 5; i++)
            v[i] = i;
    }

    std::vector<int> give()
    {
          return v;
    }

    ~A() {}
};

主:

#include <iostream>
#include "class.cpp"

int main(int argc, char **argv)
{
    A a;

    int *vptr = NULL;

    vptr = &a.give()[0];

    std::vector<int> b;

    return 0;
}

此代码编译但在执行期间给出了分段错误

2 个答案:

答案 0 :(得分:0)

此构造函数

A(){
    for(int i = 0; i < 5; i++)
        v[i] = i;
}

无效,因为向量中没有可以使用下标运算符的元素。更正确的是写

A() : v( 5 ) {
    for(int i = 0; i < 5; i++)
        v[i] = i;
}

至于你的问题,那么std :: vector有成员函数数据,它返回带有元素的内部缓冲区的地址。

所以你可以写

int * give(){ return v.data(); }

const int * give() const { return v.data(); }

主要是你可以写

int *vptr = a.give();

答案 1 :(得分:-1)

这里有几个大问题。

首先,在构造函数中,您尝试访问尚不存在的向量元素:

A(){
    for(int i = 0; i < 5; i++)
        v[i] = i;
}

vectormap不同,如果您使用operator[]查找的元素不存在,则会创建新元素。在vector中,如果您使用不存在索引的operator[],您将获得未定义的行为,并且可能会崩溃。你应该在这里插入物品。途中是push_back

A(){
  for (int i = 0; i < 5; ++i)
    v.push_back (i);
}

接下来,give()会返回vector 按值

std::vector<int> give(){
    return v;
}

制作v的副本并返回该副本。那么技术上还可以,但是当你调用give()时,你不会将返回值赋给变量。最终发生的是向量的副本成为临时对象。一旦创建临时的所谓“完整表达”完成,临时就会被破坏。

这个完整的表达是这样的:

vptr = &a.give()[0];

因此,vptr被分配了该临时vector的第一个元素的地址,但是一旦到达该表达式的末尾,该向量就被销毁,vptr现在指向到了超空间。如果您尝试取消引用此Wild指针,则会出现Undefined Behavior并且很可能出现分段错误。

要解决此问题,您可以让A告诉您vector的第一个元素的地址:

class A
{
// [...]
public:  
  void*  give() { return v.data(); }
};
相关问题