gpt4 book ai didi

c++ - 我无法使用 C++ 指针指向类方法返回的 std::vector

转载 作者:行者123 更新时间:2023-11-27 22:37:14 24 4
gpt4 key购买 nike

我试图访问私有(private) vector 成员。我很好奇为什么当我将指针指向返回 vector 时它不起作用(最后一种情况)

  std::vector<double>* ptr3 = &(obj.GetVector());
std::cout << ptr3->at(0) << '\n'; //does not work

但是,当我指向新创建的 vector 时,它起作用了。

  std::vector<double> vec3(obj.GetVector());
std::cout << vec3[3] << '\n'; //work. get 1.4

std::vector<double>* ptr1 = &vec3;
std::cout << ptr1->at(0) << '\n'; //work. get 1.1

区别只是跳过一行(首先将其分配给 vector )

当方法直接返回指针,我把它赋值给另一个指针时,也可以。

  std::vector<double>* ptr2 = obj.GetVector2();
std::cout << ptr2->at(1) << '\n'; //work. get 1.2

你能教我/解释一下这种行为吗?谢谢。

上面讨论的案例的代码如下所示。

#include <iostream>
#include <vector>

class AClass {
public:
AClass(): vec1({1.1,1.2,1.3,1.4}) {}
std::vector<double> GetVector() {
return vec1;
}
std::vector<double>* GetVector2() {
return &vec1;
}
private:
std::vector<double> vec1;
};

int main() {
AClass obj;
std::vector<double> vec2;
vec2 = obj.GetVector();
std::cout << vec2[2] << '\n'; //work. get 1.3

std::vector<double> vec3(obj.GetVector());
std::cout << vec3[3] << '\n'; //work. get 1.4

std::vector<double>* ptr1 = &vec3;
std::cout << ptr1->at(0) << '\n'; //work. get 1.1

std::vector<double>* ptr2 = obj.GetVector2();
std::cout << ptr2->at(1) << '\n'; //work. get 1.2

std::vector<double>* ptr3 = &(obj.GetVector());
std::cout << ptr3->at(0) << '\n'; //does not work
//get
//"Unhandled exception at 0x760FC54F in access_vector.exe"
//"exception: std::out_of_range at memory location 0x0033FA90

std::system("pause");
}

最佳答案

问题是 AClass::GetVector()返回 vector 的拷贝 vec1 ,不是实际的 vector vec1在您的 AClass 中声明类。

所以这一行:

std::vector<double>* ptr3 = &(obj.GetVector());

分配临时拷贝的地址,如果使用 ptr3 会导致未定义的行为在那一行之后,因为拷贝现在不见了。


一种解决方案是返回对 vector 的引用,而不是拷贝:

std::vector<double>& GetVector() {
return vec1;
}

要点是,如果您想使用原始 vector ,请返回对该 vector 的引用,而不是拷贝。

关于c++ - 我无法使用 C++ 指针指向类方法返回的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52748420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com