删除结构的成员,并将其重新制作为其他内容的副本,而不使用 new

Delete a member of a structure, and remake it as a copy of something else without using new

本文关键字:副本 new 其他 新制作 成员 结构 删除      更新时间:2023-10-16

所以我正在使用一个实际上没有那么实用的API。(具体为快速触觉)为了使我有工作的东西,我需要删除结构中的一个对象,再次创建它,(不使用new,因为对象的构造函数没有按照我需要的方式工作),然后将其设置为某些东西。

我正在尝试做一些类似的事情

delete data.cursor;
Cursor* data.cursor = (Cursor*)malloc(sizeof(Cursor));
data.cursor = data.cursors[index];

但这会导致崩溃(编辑抱歉,它没有编译是我想说的,但我不明白编译器错误)

附加信息:API 的工作方式,我需要向它发送一个指向项目的指针,它最初接受该项目并在整个执行过程中写入信息。我正在尝试更新光标类型对象上的网格。它提供了更新功能以加载新网格,但它们非常昂贵,只能以 ~3 fps 的速度运行。我的解决方案是在启动时将对象加载到数组中,然后只需切换出程序查找的对象作为光标即可。

我通常是C++新手,我的经验都是在没有指导的情况下坐下来打字,所以我可能缺少一些基本C++的东西。

编辑:只是为了清楚,这样做有效,只是非常缓慢

delete data.cursor;
data.cursor = new Cursor("filename");

其中 data.cursors[index] 在启动时以完全相同的方式声明

看起来好像您使用malloc()在地址上分配了内存,然后将地址值设置为某个对象,也许?您最可能想要的是如下所示的一行

*data.cursor = data.cursors[index];

*将取消引用该位置的内存,以便您可以设置其值。但是请注意,这将调用operator=

只是一个旁注:

new/deletemalloc()/free()混合通常是一个坏主意,因为您需要跟踪对象的分配方式。也就是说,您必须将正确的释放调用与其各自的分配调用一起使用。

它不会编译,因为您正在尝试声明一个成员:

delete data.cursor;
Cursor* data.cursor = (Cursor*)malloc(sizeof(Cursor));

是非法的,它应该是:

delete data.cursor;
data.cursor = (Cursor*)malloc(sizeof(Cursor));

另外,由于cursor是一个指针,所以

data.cursor = data.cursors[index];

将使指针指向该内存,因此先前分配的内存(通过malloc(sizeof(Cursor));将被泄漏。您可能正在这里寻找memcpy