当前位置: 首页 > 知识库问答 >
问题:

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

索瀚海
2023-03-14

我正在做一个关于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个答案

太叔京
2023-03-14

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

相关:什么是悬空指针?

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

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

 类似资料:
  • 本文向大家介绍什么是指向指针的指针? 相关面试题,主要包含被问及什么是指向指针的指针? 时的应答技巧和注意事项,需要的朋友参考一下 指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址. 此时指针指向的变量长度也是4位.

  • 问题内容: 使用Go编程语言;指针如何变得有用? (如果它们没有真正的用处,为什么不非法呢?) 问题答案: 任何数据类型的有用性取决于要解决的问题和用于解决该问题的方法。如果数据类型不适合该问题,那么它根本就不适合该问题,仅此而已。 Go编程语言(以及大多数其他编程语言)基于程序员可以用来构建新数据类型的 简单 规则。其中一些规则是: :创建一个指向T的新数据类型 :Ts数组 :包含T作为组成部分

  • 首先,澄清一下,我说的不是取消引用无效指针! 考虑以下两个例子。 例1 [3.17]不确定值-未指定值或陷阱表示 后来呢: [6.2.4p2]当指针指向的对象达到其生存期的末尾时,指针的值就变得不确定。 所有这些加在一起,我们在访问指向“死”对象的指针时有什么限制?

  • 问题内容: 为什么在下面的代码中,使用类变量作为方法指针会导致未绑定的方法错误,而使用普通变量则可以正常工作: 完整错误: 问题答案: 我喜欢从下至上查看这种行为。 Python中的函数充当“描述符对象”。因此,它具有一种方法。 对具有此类方法的类属性的读取访问将“重定向”到该方法。对类的属性访问以方式执行,而对实例的属性访问则映射到。 函数的方法的任务是将函数包装在一个方法对象中,该对象将包装参

  • 问题内容: 我经常读到,在Sun JVM中,短寿命对象(“相对较新的对象”)比长寿命对象(“相对较旧的对象”)可以更有效地进行垃圾回收。 为什么呢? 这是特定于Sun JVM还是由一般的垃圾回收原理导致? 问题答案: 大多数Java应用程序都会创建Java对象,然后很快将其丢弃。您可以在方法中创建一些对象,然后一旦退出该方法,所有对象都会死亡。大多数应用程序都是以这种方式运行的,并且大多数人倾向于

  • 问题内容: 另外,在网上可以找到许多创建静态变量的解决方案。(尽管我还没有看到我喜欢的一个。) 为什么Python不支持方法中的静态变量?这被认为是非Python的,还是与Python的语法有关? 编辑: 我专门询问了 为什么 进行设计决策,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量。 问题答案: 忽略这一点的想法是,静态变量仅在以下两种情况下才有用:何时真正应该使用类以及何时真正应