通过指向const的指针释放内存是一种好的做法吗 P.>讨论C和C++处理指针的细节问题,即 For()>代码>不接受它们,而删除< /C> >和>代码> Dele[]/Cord>DO,并且该常量不能防止对象破坏。
我感兴趣的是你是否认为这样做是一个好的实践,而不是语言(C和C++)所允许的 指向常量删除的指针的参数包括:通过指向const的指针释放内存是一种好的做法吗 P.>讨论C和C++处理指针的细节问题,即 For()>代码>不接受它们,而删除< /C> >和>代码> Dele[]/Cord>DO,并且该常量不能防止对象破坏。,c++,c,memory-management,const-correctness,C++,C,Memory Management,Const Correctness,我感兴趣的是你是否认为这样做是一个好的实践,而不是语言(C和C++)所允许的 指向常量删除的指针的参数包括: 与C的free()不同,Linus Torvalds的kfree()采用了void const*参数,因为他认为释放内存不会影响指向的内容 free()是在引入const关键字之前设计的 C++的delete操作符允许删除常量数据 反对的理由包括: 程序员在向数据传递指向const的指针时,不希望数据被修改(或删除) 许多人认为指向const的指针意味着不获取数据的所有权(但非co
- 与C的
不同,Linus Torvalds的free()
采用了kfree()
参数,因为他认为释放内存不会影响指向的内容void const*
是在引入const关键字之前设计的free()
- C++的delete操作符允许删除常量数据
- 程序员在向数据传递指向const的指针时,不希望数据被修改(或删除)
- 许多人认为指向const的指针意味着不获取数据的所有权(但非const并不意味着获取所有权)
- 这是大多数库和现有代码中常见的做法
请在你的回答中充分论证,并可能向权威机构咨询。我不打算在这里开始投票。我从未真正理解反对删除(或释放)常量指针的理由。更准确地说,我在某种程度上看到了rational,但在我看来,它们同样适用于对象中的const成员或组中的const变量,而且我从未见过有人认为,当包含对象被删除或执行离开其包含块时,不应该销毁它们,释放它们的内存 管理对象的逻辑可变性(即const或not)和管理对象的生命长度(即使用对象变量、智能指针(which和one)或原始指针)这两个问题似乎与我无关 换句话说,如果
{
Foo const x;
...
}
是一种有效的、好的风格。为什么会
{
Foo const* xptr = new Foo;
...
delete xptr;
}
不是很好的风格(使用足够的智能指针而不是原始指针,但这是另一个问题)。好吧,这里有一些相关的东西可能太长,无法放入注释中:
使用适当的策略结束对象的生命周期是一种很好的做法。对于动态对象,这意味着删除新对象,释放新对象,等等。该对象是否为常量对其生存期是否结束没有影响 常量或volatile是存在于对象生命周期内的属性,以delete表达式或free调用结束。不管你自己对这个问题的看法如何,也不管其他语言是如何工作的,C++的对象模型就是这样工作的。一个简单的示例演示了该语言如何将delete表达式转换为运算符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*
}
对象仅在创建后(即其生存期开始;在ctor正常返回时发生)和销毁前(即其生存期结束;在输入dtor时发生)为常量。在该生命周期之前或之后,您可能会有一个类型为T const*
(例如)的指针,但它不指向对象,并且取消对它的引用是无效的
同一条推理线适用于C,除非你必须考虑C大约有40年的历史,并在大部分时间内成功地保持了大量的一致性。
(我相信这个问题是主观的、有争议的,我会投票以这种方式结束它,除非我显然帮助了讨论;所以以CW的身份回答。)康斯坦斯和生命是两件不同的事情。如果一个const对象的所有者认为该对象没有生存的理由,那么释放该对象没有问题(就像一个本地的
const
对象在超出范围时会被“解除分配”)
至于
free()
不使用const
指针,我认为有人可能会认为这可能是标准委员会的疏忽,或者这是因为如果malloc()
指针返回,则使用相同类型的指针。对于我来说,接受非const指针意味着一个out参数。如果不是更新对象而是销毁对象,我同样会感到惊讶。@nobugz没有多少有价值的“最佳实践”问题(在某种程度上)是主观的,因为答案(如果有)严重依赖于实践/偏好(以及意见)的统计分布。@visitor,通过非常量指针参数传输所有权已经很常见了。所有智能指针都是在它们的构造函数和可能的重置函数中实现的,而且通常也直接在应用程序中看到(通常作为构造函数的参数-这通常是潜在的内存泄漏,但这是另一个问题的问题)@mlvljr:有人问了一个主观问题,然后又问了一个主观问题,这会促进争论。也许你错过了答案(现在被删除了),这个答案在4条评论的空间内被简化为对人的指控——这是相当有争议的。IMO,删除指针的函数应该有这样一个名称:DeleteX,destroy,FreeX,ReleaseX。这个参数是否为常量似乎根本不符合实际情况。如果函数名没有这样说,我没有理由期望void FooBar(X*)
w
struct S {
S() const; // not allowed
};