我正在做一个关于C++的OOPs的项目,并且得到了一些错误(分段错误)。
sobjects
是一个静态向量,包含指向在base
类中创建的每个对象的指针。
我还通过取消对以下行的注释来检查地址://cout<<(*it)<
//cout<
那么为什么我会得到垃圾值/分段错误呢?我一定要选什么角色吗?
下面是我的代码:
//main.cpp
#include <iostream>
#include "Base.h"
using namespace std;
int main()
{
Base::UnitTest();
vector<Base *>::iterator it;
for (it = Base::sObjects.begin(); it < Base::sObjects.end(); ++it)
{
// cout<<(*it)<<endl;
cout<<(*(*it))<<endl;
}
return 0;
}
//Base.h
#ifndef BASE_H
#define BASE_H
#include <iostream>
#include <vector>
using namespace std;
struct Node{
int val;
};
class Base
{
private:
Node node_;
public:
Base(int a=0);
~Base();
static vector<Base*> sObjects;
friend ostream &operator<<(ostream &os, const Base &myObj);
static void UnitTest();
};
#endif
//Base.cpp
#include "Base.h"
vector<Base*> Base::sObjects;
Base::Base(int a)
{
this->node_.val=a;
sObjects.push_back(this);
// cout<<this<<endl;
}
Base::~Base()
{
}
ostream &operator<<(ostream &os, const Base &myObj)
{
os<<myObj.node_.val;
return os;
}
void Base::UnitTest()
{
Base obj(23);
}
在base::unitTest()
中创建的对象超出了作用域,但在它不再存在后,您将其指针保留在向量中,使用sobjects.push_back(this);
。这是一个悬空指针的实例。这是未定义的行为。任何事情都有可能发生,包括它在某些时候似乎起作用。谢天谢地,你发现它在你的情况下不起作用。如果它虽然坏了,但看起来还能工作,那就糟多了。
相关:什么是悬空指针?
还有:C++程序员应该知道哪些常见的未定义行为?
在All链接中,这是一个使用生命周期已结束的指针的情况。使用指向其生存期已结束的对象的指针(例如,堆栈分配的对象或已删除的对象)