C++ wxRichTextCtrl未使用方法Delete()释放内存

C++ wxRichTextCtrl未使用方法Delete()释放内存,c++,windows,memory-management,wxwidgets,richtext,C++,Windows,Memory Management,Wxwidgets,Richtext,我正在编写一个日志应用程序,它接收数据并在带有彩色线条的wxRichTextCtrl框中打印日志。首先,我将日志行存储在包含文本和颜色信息的结构向量中,然后wxTimer()事件触发一个函数,该函数读取向量的内容并将其附加到富文本窗口 当富文本缓冲区达到250行时,我会删除最早的一行,以便在日志窗口中始终显示最多250行。显然,这并不能释放内存。在任务管理器中查看可执行文件的内存使用情况,我可以看到每一行使用的内存都在增加,即使程序正确地删除了最旧的行。这是wxRichTextCtrl的已知错误

我正在编写一个日志应用程序,它接收数据并在带有彩色线条的wxRichTextCtrl框中打印日志。首先,我将日志行存储在包含文本和颜色信息的结构向量中,然后wxTimer()事件触发一个函数,该函数读取向量的内容并将其附加到富文本窗口

当富文本缓冲区达到250行时,我会删除最早的一行,以便在日志窗口中始终显示最多250行。显然,这并不能释放内存。在任务管理器中查看可执行文件的内存使用情况,我可以看到每一行使用的内存都在增加,即使程序正确地删除了最旧的行。这是wxRichTextCtrl的已知错误吗

下面是我代码的一些摘录:

声明:

wxRichTextCtrl *lstEventList;
// A vector of structures, a nice way to create a multi-dimensional vector
struct MidiLogStruct { wxString Text; wxColour Color; };
vector<MidiLogStruct> MidiLog;
在填充显示框的计时器功能中:

// Show all data stored in buffer
for (unsigned int i=0; i < MidiLog.size(); ++i)
{
    lstEventList->SetInsertionPointEnd();                           // Set cursor after the last character
    lstEventList->Newline();                                        // Add a new CRLF
    lstEventList->BeginTextColour(MidiLog[i].Color);                // Set text color
    lstEventList->WriteText(MidiLog[i].Text);                       // Write text
    lstEventList->ShowPosition(lstEventList->GetLastPosition());    // Make sure the last line is in view
}

// Clear buffer
MidiLog.clear();

// Delete all lines that exceed the max NUMOFMIDILOGLINES
if (lstEventList->GetNumberOfLines() > NUMOFMIDILOGLINES)
    lstEventList->Delete(wxRichTextRange(0, lstEventList->XYToPosition(0, lstEventList->GetNumberOfLines() - NUMOFMIDILOGLINES)));
//显示缓冲区中存储的所有数据
for(无符号整数i=0;iSetInsertionPointEnd();//将光标设置在最后一个字符之后
lstEventList->Newline();//添加新的CRLF
lstEventList->BeginTextColour(MidiLog[i].Color);//设置文本颜色
lstEventList->WriteText(MidiLog[i].Text);//写入文本
lstEventList->ShowPosition(lstEventList->GetLastPosition());//确保最后一行在视图中
}
//清除缓冲区
MidiLog.clear();
//删除所有超过最大NUMOFIDILOGLINES的行
如果(lstEventList->GetNumberOfLines()>NumOfMidLogLines)
lstEventList->Delete(wxRichTextRange(0,lstEventList->XYToPosition(0,lstEventList->GetNumberOfLines()-numofmidloglines));

您看到了吗?是的,我已经在全局范围内使用了BeginSuppressUndo(),但这似乎没有什么帮助。
// Show all data stored in buffer
for (unsigned int i=0; i < MidiLog.size(); ++i)
{
    lstEventList->SetInsertionPointEnd();                           // Set cursor after the last character
    lstEventList->Newline();                                        // Add a new CRLF
    lstEventList->BeginTextColour(MidiLog[i].Color);                // Set text color
    lstEventList->WriteText(MidiLog[i].Text);                       // Write text
    lstEventList->ShowPosition(lstEventList->GetLastPosition());    // Make sure the last line is in view
}

// Clear buffer
MidiLog.clear();

// Delete all lines that exceed the max NUMOFMIDILOGLINES
if (lstEventList->GetNumberOfLines() > NUMOFMIDILOGLINES)
    lstEventList->Delete(wxRichTextRange(0, lstEventList->XYToPosition(0, lstEventList->GetNumberOfLines() - NUMOFMIDILOGLINES)));