gpt4 book ai didi

c++ - 通过指向常量的指针释放内存是一种好习惯吗

转载 作者:可可西里 更新时间:2023-11-01 16:05:59 24 4
gpt4 key购买 nike

有很多问题讨论了 C 和 C++ 处理常量指针删除的细节,即 free() 不接受它们,deletedelete[] 执行并且常量性不会阻止对象销毁。

我感兴趣的是您是否认为这样做是一种好的做法,而不是语言(C 和 C++)所允许的。

删除常量指针的参数包括:

  • Linus Torvalds 的 kfree() 与 C 的 free() 不同,它采用 void const* 参数,因为他认为释放内存不影响指向的内容。
  • free() 是在引入 const 关键字之前设计的。
  • C++ 的删除运算符允许删除常量数据。

反对它的论点包括:

  • 程序员不希望在向数据传递指向常量的指针时修改(或删除)数据。
  • 许多人认为指向 const 的指针意味着不获得数据的所有权(但不是说非 const 就意味着获得所有权)。
  • 这是大多数库和现有代码中常见的做法。

请在您的回复中充分论证,并可能引用权威人士。我的意图不是在这里开始投票。

最佳答案

使用适当的策略来结束对象的生命周期是一种很好的做法。对于动态对象,这意味着删除新的、释放 malloc 的,等等。该对象是否为 const 对其生命周期是否应该结束没有影响。

常量或 volatile 是存在于对象生命周期内并以删除表达式或调用 free 结束的属性。无论您对此事有何看法或其他语言的工作方式如何,这就是 C++ 的对象模型的工作方式。一个简单的例子来说明这一点是语言如何将 delete-expressions 转换为运算符 delete 调用:

#include <new>
void* operator new(std::size_t size);
void operator delete(void* p);

int main() {
delete new int(); // int* to void*, since this is also an allowed
// implicit conversion, it may not be clear what is happening

// however, these are clearly not implicit conversions:
delete new int const(); // int const * to void*
delete new int volatile(); // int volatile* to void*
delete new int const volatile(); // int const volatile* to void*
}

另一个例子,但可能不太清楚,是为什么你不能在 const 上重载 ctors:

struct S {
S() const; // not allowed
};

一个对象只有在它被创建之后(也就是它的生命周期开始;发生在 ctor 正常返回时)和它被销毁之前(也就是它的生命周期结束;发生在进入 dtor 时)才是常量。在该生命周期之前或之后,您可能有一个类型为 T const* 的指针(例如),但它不指向对象并且取消引用它是 UB。

同样的推理也适用于 C,除了你必须考虑到 C 有大约 40 年的历史并且在大部分时间里成功地保持了大量的一致性。

(我认为这个问题是主观的和有争议的,并且会投票以这种方式结束它,除非我显然帮助了 spark 讨论;所以作为 CW 回答。)

关于c++ - 通过指向常量的指针释放内存是一种好习惯吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2288291/

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