Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过指向const的指针释放内存是一种好的做法吗 P.>讨论C和C++处理指针的细节问题,即 For()>代码>不接受它们,而删除< /C> >和>代码> Dele[]/Cord>DO,并且该常量不能防止对象破坏。_C++_C_Memory Management_Const Correctness - Fatal编程技术网

通过指向const的指针释放内存是一种好的做法吗 P.>讨论C和C++处理指针的细节问题,即 For()>代码>不接受它们,而删除< /C> >和>代码> Dele[]/Cord>DO,并且该常量不能防止对象破坏。

通过指向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和C++)所允许的

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

  • 与C的
    free()
    不同,Linus Torvalds的
    kfree()
    采用了
    void const*
    参数,因为他认为释放内存不会影响指向的内容
  • free()
    是在引入const关键字之前设计的
  • C++的delete操作符允许删除常量数据
反对的理由包括:

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

请在你的回答中充分论证,并可能向权威机构咨询。我不打算在这里开始投票。

我从未真正理解反对删除(或释放)常量指针的理由。更准确地说,我在某种程度上看到了rational,但在我看来,它们同样适用于对象中的const成员或组中的const变量,而且我从未见过有人认为,当包含对象被删除或执行离开其包含块时,不应该销毁它们,释放它们的内存

管理对象的逻辑可变性(即const或not)和管理对象的生命长度(即使用对象变量、智能指针(which和one)或原始指针)这两个问题似乎与我无关

换句话说,如果

{
    Foo const x;
    ...
}
是一种有效的、好的风格。为什么会

{
    Foo const* xptr = new Foo;
    ...
    delete xptr;
}

不是很好的风格(使用足够的智能指针而不是原始指针,但这是另一个问题)。

好吧,这里有一些相关的东西可能太长,无法放入注释中:

  • 不久前,通过指向const的指针释放内存的做法被明令禁止,请参阅

  • 有两次相关讨论:,(两个都实际处理了所讨论的案例,即指向const的指针)

  • 我自己的观点(因为您要求参数):在任何给定上下文中,所讨论的操作的可能性是由类或函数的契约(在文档中显式或隐式定义)定义的,而不仅仅是由方法签名或参数类型定义的


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

    常量或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
    };