std::vector pushback 在 C++ 静态方法中使用时会抛出EXC_BAD_ACCESS
std::vector pushback throws EXC_BAD_ACCESS when used inside a C++ static method
我有一个带有静态工厂方法的类Foo-Foo::createOne - 它创建一个实例并将一些数据放入std:vector类型的私有成员变量中。 当我调用 Foo::createOne 时,我的程序会抛出此异常:"EXC_BAD_ACCESS(无法访问内存(">
这是代码:
福.h
#include <vector>
class Foo {
public:
Foo();
Foo(const Foo& orig);
virtual ~Foo();
static Foo * createOne();
private:
std::vector<int> v;
};
傅.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;
}
主.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);
第一行是创建一个原始的、未初始化的指针。它不是变量的实例,因此尝试取消引用它是未定义的行为。
您需要将其初始化为实例,如下所示:
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
将耗尽内存,并且设置指向它的指针也将是未定义的行为。
你应该在使用
之前创建一个Foo的实例。在堆上,您可以使用以下内容
Foo *f = new Foo();
您正在取消引用尚未初始化的指针:
Foo *f; // f not pointing to a Foo instance
f->v.push_back(5);
这是不确定的行为。您必须f
指向有效的Foo
对象。
C++当你声明一个指针时,需要手动调用构造函数,如下所示:
Foo * Foo::createOne() {
Foo *f = new Foo; // <<=== Here
f->v.push_back(5);
return f;
}
这与定义为对象而不是指针的对象不同:
Foo Foo::createOne() {
Foo f; // No initializer is necessary
f.v.push_back(5);
return f;
}
在这种情况下,对象按值返回,因此在此过程中复制其内容。
动态创建对象时,需要删除指针指向的对象以避免内存泄漏,如下所示:
int main(int argc, char** argv) {
std::cout << "Testing createOne." << std::endl;
Foo *myFoo = Foo::createOne();
std::cout << "It worked." << std::endl;
delete myFoo;
}
相关文章:
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- "400 Bad request"使用 OpenSSL BIO 进行请求时
- 解密文件AES_256_CBC返回"bad decrypt"错误
- 在C++流中,eof(),fail(),bad()和good()有什么区别
- make / gcc:"bad build"的可能原因是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 在多线程环境中,什么可能导致"bad file descriptor"?
- "std::vector"在调整大小时引发"bad allocation"异常
- 尝试使用 execp、dup2 和管道实现 shell,挂起或"bad file descriptor"
- OpenCV SVM 在火车上抛出异常,"Bad argument (There is only a single class)"
- 成员函数 bad() 的 std::ftsream 用于检查
- 使用 boost::asio 和 boost::thread 时"Bad file descriptor"
- OpenCV C++神经网络 predict() 函数抛出"Bad argument"错误