gpt4 book ai didi

c++ - C - 将指针转换为指向 void 的指针

转载 作者:行者123 更新时间:2023-11-30 18:40:05 24 4
gpt4 key购买 nike

编辑我不需要问题的解决方案,我想知道是否以及为什么我应该更喜欢一件事而不是另一件事。函数声明不能更改

我有一个 C++ 项目,我需要编写一些代码,这些代码将由用 C 编写的代码调用。我有一个名为 A 的类。 ,我需要实现一个方法来销毁由 new 分配的此类对象。 ,并使指针本身无效。

声明如下:

void destroy_A(void** a);

我需要一个void**这样我就可以取消*a .

我应该使用以下哪一项(如果有),为什么

delete *(A**)a;
delete *((A**)a);
delete (A*)*a;

编辑:也许我不清楚:我不知道技术术语,但我确实使用 delete而不是free ,并且实际的方法是通过用 C 编译的代码调用的。否则,我不需要 void** .

这是我的计算机科学教师要求,我没有写作业:)

最佳答案

这三个都有效。你要找的,到底是

A* somePtr = ...; // get a pointer to your object
delete somePtr; // delete the object it points to

下面复制了您的三个选项,每个选项都分为多行以突出显示它们正在执行的操作:

delete *(A**)a;

A** ptrToPtrToA a = (A**)a;
A* ptrToA a2 = *ptrToPtrTo_a;
delete ptrTo_a;

这里没问题。我们最终正确地取消了对象的引用

delete *((A**)a);

A** ptrToPtrTo_a = (A**)a;
A* ptrTo_a = *ptrToPtrTo_a;
delete ptrTo_a;

嘿,这个一模一样!括号的唯一作用是改变运算顺序。您碰巧使用了“ native ”顺序,因此括号根本没有任何作用。

delete (A*)*a;

void* ptrTo_void = *a;
A* ptrTo_a = (A*)ptrToVoid;
delete ptrTo_a;

这也有效,只是走了不同的路。

哪一个是正确的?这确实是一种风格选择。我将向您提供我的经验法则:始终在单独的行上转换空指针。它使发生的事情变得更加清晰。

A* myObject = (A*)*a; // I prefer this one in this case, but what matters...
delete myObject; // ... is that it is distinct from the delete...
*a = 0; // ...not which cast is "best."

我喜欢这样做,因为我发现当你真正认真对待它时,向/从 void 进行转换是一件非常棘手的事情。有很多地方可能会出错。我喜欢创建一行清晰的代码,这样我就可以在心里分解我的所有类型转换并确保它达到我的预期。由于我指定了我想要的变量的类型(myObjectA*,并且如果我搞砸了,编译器无法做任何事情),所以我如果我做错了什么,更有可能出现编译器错误。从 void 编写强制转换非常容易,编译器会默默地执行您意想不到的转换。然后您将修复运行时错误而不是编译时错误。

我也喜欢使用该强制转换行作为放置注释的好地方,解释为什么我认为首先进行强制转换是安全的,例如“传递给的唯一空指针”该函数是由我的函数在同一个 .cpp 文件中创建的函数,因此我确切地知道可以安全地转换为哪种类型。”

关于c++ - C - 将指针转换为指向 void 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27205825/

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