gpt4 book ai didi

c++ - 在 C++ 静态方法中使用时,std::vector pushback 抛出 EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-11-30 00:53:13 25 4
gpt4 key购买 nike

我有一个带有静态工厂方法 Foo::createOne 的类 Foo,它创建一个实例并将一些数据放入 std:vector 类型的私有(private)成员变量中。当我调用 Foo::createOne 时,我的程序抛出这个异常:“EXC_BAD_ACCESS(无法访问内存)”

代码如下:

Foo.h

#include <vector>

class Foo {
public:
Foo();
Foo(const Foo& orig);
virtual ~Foo();

static Foo * createOne();

private:
std::vector<int> v;

};

Foo.cpp

#include "Foo.h"

Foo::Foo() {
};

Foo::Foo(const Foo& orig) {
};

Foo::~Foo() {
};

Foo * Foo::createOne() {
Foo *f;
f->v.push_back(5);
return f;
}

main.cpp

#include <iostream>
#include "Foo.h"

int main(int argc, char** argv) {

std::cout << "Testing createOne." << std::endl;
Foo *myFoo = Foo::createOne();
std::cout << "It worked." << std::endl;

}

解决了一个问题...

感谢您的回答。我修复了未初始化的指针问题(如下)。现在,我收到编译器警告“返回局部变量‘f’的地址”

Foo * Foo::createOne() {
Foo f;
f.v.push_back(5);
return &f;
}

最佳答案

Foo *f;
f->v.push_back(5);

第一行是创建一个原始的、未初始化的指针。它不是变量的实例,因此尝试取消引用它是 Undefined Behavior .

你需要将它初始化为一个实例,像这样:

Foo *f = new Foo();
f->v.push_back(5);
// ...

delete f;

只有这样你的代码才会生效。


更新:再次检查您的代码后,我现在意识到您完全没有必要使用指针。您可以通过按值返回来做很多相同的事情:

Foo Foo::createOne()
{
Foo f;
f.v.push_back(5);
return f;
}

您收到错误 address of local variable f returned 的原因是您返回了一个指向临时值的指针。局部变量 f 将在函数结束时内存不足,并且设置指向它的指针也将是未定义的行为。

关于c++ - 在 C++ 静态方法中使用时,std::vector pushback 抛出 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17032626/

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