C ++无法在结构中存储指针

时间:2014-10-18 00:41:47

标签: c++ qt

首先,我是c ++的新手。如果有更好的方法,那么一个结构,请提及它。

所以我想要做的是创建一个结构来存储指向某些自定义对象的指针。原因是我不必传递许多参数指针,我可以声明这个结构并将结构传递给需要这组对象的函数。

所有对象的原因是我正在与Web服务进行修复性交互。我已经创建了一个类来简化与Web服务的交互,并且不希望每次需要时都销毁它们并重新创建它们。

注意:这是在Qt 5中完成的

这是标题:

struct MyStruct
{
    MyClass* Class1;
    MyClass* Class2;
    MyClass* Class3;
    MyClass* Class4;
};

现在这是我试图填写结构的一小部分:

//Stucture of commonly used objects, for all to access
MyStruct* theStruct;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //Build object
    MyClass* firstClass = new MyClass(/*params for object*/);
    theStruct->Class1 = firstClass;

    ui->setupUi(this);
    connect(firstclass, SIGNAL(dataReady()),this,SLOT(updateWebStats(MyStruct)));
}

现在我得到错误:

App输出:

  

启动MyExe.exe   错误 - RtlWerpReportException失败,状态码为:-1073741823。将尝试

直接启动流程:

  

该程序意外完成。   MyExe.exe崩溃了

当我调试时,我得到一个弹出窗口

The inferior stopped because it received a signal from the Operating System.

Signal name : SIGSEGV
Signal meaning : Segmentation fault

此时调试器位于主窗口构造函数中的这一行:

theStruct->Class1 = firstClass;

3 个答案:

答案 0 :(得分:2)

您正在尝试访问未分配的指针,这会导致分段错误。

尝试初始化它:

MyStruct* theStruct = new MyStruct();

答案 1 :(得分:2)

我不同意使用全局变量让生活更轻松的想法。 Are global variables bad?

但这是你的错误。

theStruct,也必须初始化。

如果是静态成员,则应将其设置为零。

最好将类的指针设置为零。

struct theStruct
{
    // default constructor
    theStruct() : Class1(0), Class2(0), Class3(0), Class4(0) {}
    MyClass* Class1;
    MyClass* Class2;
    MyClass* Class3;
    MyClass* Class4;
};

然后在访问时,您应该检查以确保它已初始化为:

if(theStruct && theStruct->Class1)
    theStruct->Class1->foo();

上述if语句的顺序执行以下操作:如果theStruct不为零,则调用new并且是有效指针,并且如果Struct中的Class1不为零(也有{{1}调用它),然后使用它,因为它是安全可用的。

希望有所帮助。

答案 2 :(得分:0)

在您的示例中似乎没有理由使用指向MyStruct的指针。你不应该使用一个,除非你有一些令人信服的理由,这似乎并非如此。如果您不使用指针,则无需在代码中使用new对其进行初始化。它在编译时通过您的声明和定义自动初始化。

MyStruct theStruct;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //Build object
    MyClass* firstClass = new MyClass(/*params for object*/);
    theStruct.Class1 = firstClass;

    ui->setupUi(this);
    connect(firstclass, SIGNAL(dataReady()),this,SLOT(updateWebStats(&MyStruct)));
}

首先查看Resource Acquisition Is Initialization。很多程序员在没有必要时会自动使用C ++中的指针。只有在绝对需要它们时才使用指针,并且在C ++ 11中尽可能使用std::shared_ptrstd::unique_ptr

不要将C ++与Java,Delphi或C#等语言混淆,后者要求您在免费商店中分配类,并仅使用引用/指针访问它们。在C ++中,您可以 classstruct对象声明基于堆栈的变量。

  

如果有更好的方法可以做到这一点,那么请提一下结构。

std::vector<MyClass*>可能更可取。请参阅:std::vector

  

std :: vector是一个封装动态大小的序列容器   阵列。

     

元素是连续存储的,这意味着元素可以   不仅可以通过迭代器访问,还可以使用常规偏移   指向元素的指针。这意味着指向一个元素的指针   vector可以传递给任何需要指针的函数   数组的元素....