当我尝试初始化一个具有指向其他类对象的类指针变量的类时,会出现分段错误。下面的示例代码段。
我尝试使用'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
,它似乎已经解决了。但是仍然:有人可以解释为什么这样做有效,而使用指针却不可行吗?
答案 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
,而且甚至没有指向可用的内存位置,这就是为什么出现分段错误的原因。