gpt4 book ai didi

c++ - 撤消/重做时释放内存时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:48 28 4
gpt4 key购买 nike

我正在为一个类的项目工作,我们应该在该类中实现文本编辑器的基本功能,包括撤消和重做。我目前的撤消/重做功能正常工作,唯一的问题是,我在尝试从 Command 中释放内存时遇到 valgrind 错误。告诉我们要执行什么的对象。

Command对象是命名空间中结构的一部分,如下所示:

struct UserInteraction
{
UserInteractionType type;
Command* command;
};

目前,我将用户发出的每条命令存储在 <UserInteraction> 类型的 std::vector 中称为 undoStack .我还有一个 redoStack属于同一类型,也是 std::vector。存储每个命令如下所示:

    else if (interaction.type == UserInteractionType::command) // COMMAND
{
try
{
interaction.command->execute(editor);
commandInteraction = true;
undoStack.push_back(interaction);
view.clearErrorMessage();
}
catch (EditorException& e)
{
delete interaction.command;
view.showErrorMessage(e.getReason());
}
view.refresh();
} // end if-else

当用户按下 ctrl+x(退出程序)时,我需要解除分配被插入 vector 的每个 UserInteraction。否则,我发出的任何命令都会给我这样的错误:

4 bytes in 1 blocks are definitely lost in loss record 2 of 38

输入的每个命令都会使丢失的字节数增加 4。

我想我只需要在 quit 命令中释放每个 vector 使用的所有内存,但人们使用的所有当前解决方案似乎仍然给我内存泄漏。这是我的退出方法的两个版本(这两个版本仍然会导致内存泄漏):

第一次尝试:

    if (interaction.type == UserInteractionType::quit)
{
clear undo
std::vector<UserInteraction>().swap(undoStack);
clear redo
std::vector<UserInteraction>().swap(redoStack);
break;
}

我第二次尝试释放内存:

    if (interaction.type == UserInteractionType::quit)
{
undoStack.clear();
undoStack.shrink_to_fit();
redoStack.clear();
redoStack.shrink_to_fit();
break;
}

那么我怎样才能真正释放两个 vector 中的所有内容呢?

最佳答案

通过释放 vector 的内存,您只会破坏 UserInteractions,而不会破坏它们指向的命令。如果您使用 c++11 编译器,则可以使用智能指针。

struct UserInteraction
{
UserInteractionType type;
std::unique_ptr<Command> command;
// or
std::shared_ptr<Command> command;
};

这将自动负责删除命令。如果没有,我将删除循环遍历 vector 元素中的所有命令。(您还可以编写一个删除命令的 costum 析构函数,以及一个复制赋值运算符和 -ctor(深层复制),以及移动赋值运算符和 -ctor,但这似乎是一个过于复杂的解决方案)

关于c++ - 撤消/重做时释放内存时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27371967/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com