提问者:小点点

为什么类对象指针的静态向量有垃圾值?


我正在做一个关于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);
}

共1个答案

匿名用户

base::unitTest()中创建的对象超出了作用域,但在它不再存在后,您将其指针保留在向量中,使用sobjects.push_back(this);。这是一个悬空指针的实例。这是未定义的行为。任何事情都有可能发生,包括它在某些时候似乎起作用。谢天谢地,你发现它在你的情况下不起作用。如果它虽然坏了,但看起来还能工作,那就糟多了。

相关:什么是悬空指针?

还有:C++程序员应该知道哪些常见的未定义行为?

在All链接中,这是一个使用生命周期已结束的指针的情况。使用指向其生存期已结束的对象的指针(例如,堆栈分配的对象或已删除的对象)