分配指针时出现分段错误

时间:2019-10-21 23:32:14

标签: c++ pointers initialization sfml

当我尝试初始化一个具有指向其他类对象的类指针变量的类时,会出现分段错误。下面的示例代码段。

我尝试使用'new'关键字将变量初始化为空类,然后在分配之前手动使用malloc进行初始化,并尝试仅在没有任何花哨分配的情况下分配变量,而没有任何效果。

id
---
1 (not expected if date range cutoff specified) created_at > '2001-01-10'
2
4 (not expected if date range cutoff specified) created_at > '2001-01-10'
5

我在使用C ++方面还很陌生,所以请原谅我遇到明显的内存错误。我曾尝试寻找解决方案,但没有找到任何有效的方法。我接受指向Application的指针作为构造函数的输入,因为我希望RenderWindow和Application的相同实例可以保存在其他对象中。

编辑:我真的很傻,但是我改变了// Caller void Application::run() { Network network(this); network.start(); } // Seg fault here, at the line that assigns window Network::Network(Application *app) { application = new Application(); window = new sf::RenderWindow(); application = app; window = app->window; } // Header for Network class Network { public: Application* application; sf::RenderWindow* window; // Functions Network(Application *app); void start(); void networkLoop(); private: protected: }; // Header for Application class Application { public: sf::RenderWindow* window; Theme* theme; // Functions Application(); void run(); private: protected: }; // Main #include "application.h" #include <X11/Xlib.h> int main() { XInitThreads(); Application* app; app->run(); } ,用main()而不是Application创建了Application app,它似乎已经解决了。但是仍然:有人可以解释为什么这样做有效,而使用指针却不可行吗?

2 个答案:

答案 0 :(得分:3)

问题出在您的return

Date_Time            Address      Consumption (Litres/hr)
19/4/2016 13:00      41-2TV            20
20/4/2016 14:00      41-2TV            40
21/4/2016 15:00      41-2TV            16
19/4/2016 13:00      39-2TV            20
20/4/2016 14:00      39-2TV            40
21/4/2016 15:00      39-2TV            16
19/4/2016 13:00      43-2TV            20
20/4/2016 14:00      43-2TV            40
21/4/2016 15:00      43-2TV            16

您需要在此处使用main()并分配int main() { XInitThreads(); Application* app; app->run(); }

new

但是,不要Application中进行。那会造成内存泄漏。改为这样做:

int main()
{
    XInitThreads();
    Application* app = new Application(...);
    app->run();
}

编辑:

  

有人可以解释为什么这样行得通,而使用指针行不通吗?

因此,指针本身不会分配任何内存。它们只是指针。他们持有地址。他们不会自行分配内存来允许这样的事情:

Network

如果指针在此处分配了数据,则可能导致内存泄漏或其他原因。因此,如果要保留一个独立于其他变量的新对象,则需要使用Network::Network(Application *app) { application = app; window = app->window; } 或一些智能指针:

int a =0;
int *b = &a; // holds address of a

因此,如果您只是这样做:

new

int* c = new int; // c holds an int independent of a or b 本身没有在其位置分配的内存。它是一个可以容纳任何地址的占位符。它可以保存现有地址,也可以保存新地址。但是它需要存储一些有效地址,然后才能使用它。

如果要创建int* d; 的实例,则必须用d分配它,或者,正如其他人指出的那样,根本不使用指针,这实际上是推荐的行动方针:

Application

答案 1 :(得分:3)

要回答您的修改,两者之间的区别

Application* app;

Application app;

什么是分配和构造的,什么不是。

在第一个示例中,编译器在堆栈中预留了足够的空间来容纳指针,但没有为其可能指向的内容预留任何空间-您需要使用new手动进行此操作。这就是为什么程序无法运行的原因-您有一个指针空间,但是当您用->取消引用该指针时,另一端没有Application等待。您告诉它找到一个Application并使用window属性并将其存储在其他位置,但是从未创建过该window属性。

在第二个示例中,编译器为完整的Application对象留出足够的空间,并为您调用构造函数。因此,当您这次取消引用指针时,会有Application等待在那里使用。


我想补充一条信息。在第一个示例中,指针不是对象,也没有要调用的构造函数,因此,如果您不给它们分配值,则它们的初始值本质上是随机的-当时是堆栈中的任何值。因此,不仅您的指针没有指向Application,而且甚至没有指向可用的内存位置,这就是为什么出现分段错误的原因。