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

雅利安·阿加瓦尔

我正在用 C++ 做一个关于 OOP 的项目,但遇到了一些错误(分段错误)。

sObjects是一个静态向量,包含指向Base类中创建的每个对象的指针

我还通过取消注释这些行来检查地址:// cout<<(*it)<<endl; // cout<<this<<endl;。它们是相同的。

那么为什么我会收到垃圾值/分段错误?我必须做某种铸造吗?

这是我的代码:

//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++ 程序员应该知道哪些常见的未定义行为?

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能拥有指向与成员变量具有相同指针类型的对象的指针?

来自分类Dev

指向类对象的指针的向量

来自分类Java

当对象的所有字段都设置为默认值时,为什么实例常量具有值?

来自分类Dev

为什么在向量中对类成员的引用指向不同对象的相同值?

来自分类Dev

C++ 指向新类的类指针与指向类对象的指针有什么区别?

来自分类Dev

为什么静态向量在不同的类中似乎具有不同的内容?

来自分类Dev

为什么基类指针即使拥有派生类对象地址也总是指向基类?

来自分类Dev

指向超类对象的指针可以用作指向子类对象的指针。但是不能调用子类的成员函数。为什么?

来自分类Dev

当相关变量具有值时,为什么我的BeautifulSoup代码收到属性错误?

来自分类Dev

为什么Pytorch中未初始化的张量具有初始值?

来自分类Dev

我不明白为什么这些变量具有这些值

来自分类Dev

为什么“ this”指向类而不是类对象?

来自分类Dev

如果同一个静态成员变量具有不同的值会发生什么

来自分类Dev

C++ 使用指向指针向量的指针有什么好处?

来自分类Dev

为什么向量中的所有指针都指向同一元素?

来自分类Dev

为什么“ this”指针在派生类和第一个基类中具有相同的值

来自分类Dev

初始化具有指向另一个类的成员变量的成员指针的类的向量

来自分类Dev

具有指向函数的指针的函数和具有默认值的向量作为参数会导致编译错误

来自分类Dev

当静态对象为静态对象时,为什么具有自动存储的对象不为零?

来自分类Dev

指向对象的指针向量C ++

来自分类Dev

指向向量中对象的指针有时指向向量中的其他对象

来自分类Dev

为什么推力::设备向量似乎没有机会保存指向其他设备向量的原始指针?

来自分类Dev

为什么所有指向结构的指针都必须具有相同的大小?

来自分类Dev

两个类都有指向每个的指针向量

来自分类Dev

在静态向量中删除唯一的类对象指针

来自分类Dev

为什么指向类的指针可以通过函数调用更改值?

来自分类Dev

为什么具有超类值的Map不能接受子类对象?

来自分类Java

为什么内部包含类对象数组的构造函数具有空值

来自分类Dev

当指针指向零值时,为什么指针为空白?

Related 相关文章

  1. 1

    为什么我不能拥有指向与成员变量具有相同指针类型的对象的指针?

  2. 2

    指向类对象的指针的向量

  3. 3

    当对象的所有字段都设置为默认值时,为什么实例常量具有值?

  4. 4

    为什么在向量中对类成员的引用指向不同对象的相同值?

  5. 5

    C++ 指向新类的类指针与指向类对象的指针有什么区别?

  6. 6

    为什么静态向量在不同的类中似乎具有不同的内容?

  7. 7

    为什么基类指针即使拥有派生类对象地址也总是指向基类?

  8. 8

    指向超类对象的指针可以用作指向子类对象的指针。但是不能调用子类的成员函数。为什么?

  9. 9

    当相关变量具有值时,为什么我的BeautifulSoup代码收到属性错误?

  10. 10

    为什么Pytorch中未初始化的张量具有初始值?

  11. 11

    我不明白为什么这些变量具有这些值

  12. 12

    为什么“ this”指向类而不是类对象?

  13. 13

    如果同一个静态成员变量具有不同的值会发生什么

  14. 14

    C++ 使用指向指针向量的指针有什么好处?

  15. 15

    为什么向量中的所有指针都指向同一元素?

  16. 16

    为什么“ this”指针在派生类和第一个基类中具有相同的值

  17. 17

    初始化具有指向另一个类的成员变量的成员指针的类的向量

  18. 18

    具有指向函数的指针的函数和具有默认值的向量作为参数会导致编译错误

  19. 19

    当静态对象为静态对象时,为什么具有自动存储的对象不为零?

  20. 20

    指向对象的指针向量C ++

  21. 21

    指向向量中对象的指针有时指向向量中的其他对象

  22. 22

    为什么推力::设备向量似乎没有机会保存指向其他设备向量的原始指针?

  23. 23

    为什么所有指向结构的指针都必须具有相同的大小?

  24. 24

    两个类都有指向每个的指针向量

  25. 25

    在静态向量中删除唯一的类对象指针

  26. 26

    为什么指向类的指针可以通过函数调用更改值?

  27. 27

    为什么具有超类值的Map不能接受子类对象?

  28. 28

    为什么内部包含类对象数组的构造函数具有空值

  29. 29

    当指针指向零值时,为什么指针为空白?

热门标签

归档