内存所有位置 wxWidgets

memory alllocation wxWidgets

本文关键字:wxWidgets 位置 内存      更新时间:2023-10-16

我试图在我的应用程序中有一个动态内存分配。如果我尝试在OnInit()中分配内存,则应用程序崩溃。

目前,我正在使用wxWidgets 3.0.4的最新稳定版本和Visual Studio 2010。

如果我#define BUFFER发表评论,则应用程序按预期工作。

我的主要.h:

#include <wx/wx.h>
class MyApp : public wxApp {
public:
virtual bool OnInit();
};
class MainWindow : public wxFrame {
public:
MainWindow(const wxPoint& position, const wxSize& size);
~MainWindow();
private:
void setupUi();
int *buffer0;
};

主.cpp

#include "main.h"
#define BUFFER
IMPLEMENT_APP(MyApp)
//-----------------------------------------------------------------------------
bool MyApp::OnInit() {
MainWindow *main = new MainWindow(wxPoint(20, 20), wxSize(300, 200));
main->Show(true);
return true;
}

//----------------------------------------------------------------------------
MainWindow::MainWindow(const wxPoint& position, const wxSize& size) : wxFrame(NULL, wxID_ANY, "Frame") {
setupUi();
#ifdef BUFFER
buffer0 = new int(1000);
memset(buffer0, 0, 10 * sizeof(int));
#endif
}

//----------------------------------------------------------------------------
MainWindow::~MainWindow() {
#ifdef BUFFER
delete[] buffer0;
#endif
}
//----------------------------------------------------------------------------
void MainWindow::setupUi() {
wxBoxSizer *bsMain = new wxBoxSizer(wxVERTICAL);
wxStaticBox *sbInfo = new wxStaticBox(this, wxID_ANY, "INFORMATION");
bsMain->Add(sbInfo, 1, wxALL | wxEXPAND, 15);
SetSizer(bsMain);
}

buffer0 = new int(1000);

您为 1(单词:1(分配内存int并使用10000初始化它。然后用

memset(buffer0, 0, 10 * sizeof(int));

10 * sizeof(int)字节从buffer设置为零。您访问的内存不属于您。

由于您在析构函数中使用了delete[],我猜您想编写

buffer0 = new int[1000];

甚至

buffer0 = new int[1000]{};

int初始化为零,而不必使用memset()


真实(tm(答案:

std::vector<int> buffer0(1000);

两者之间有区别

buffer0 = new int(1000); // allocate sizeof(int) bytes

buffer0 = new int[1000]; // allocate sizeof(int) * 1000 bytes

您的程序具有未定义的行为,因为您分配了sizeof(int)字节,但

memset(buffer0, 0, 10 * sizeof(int));

您希望将sizeof(int) * 10字节设置为 0。您正在访问您无权访问的内存。 使用方括号创建数组new int[1000]