【问题标题】:Does malloc return an "invalid pointer value" in C++17? [duplicate]malloc 在 C++17 中是否返回“无效指针值”? [复制]
【发布时间】:2020-03-22 02:16:54
【问题描述】:

根据 C++17 [basic.compound]/3:

指针类型的每个值都是以下之一:

  • 指向对象或函数的指针(该指针被称为指向对象或函数),或
  • 超过对象末尾的指针 (8.7),或
  • 该类型的空指针值 (7.11),或
  • 一个无效的指针值。

malloc 函数返回一个指针值。让我们假设调用成功,因此返回值不为空。 malloc ([c.malloc]) 的规范并没有说明它在返回的存储中创建任何对象,因此看起来“无效指针值”是最不无意义的类别。

【问题讨论】:

  • 简答:yes.
  • 旁注:如果p0593rX标准提案被采纳,答案将会改变。
  • 我相信这取决于类型。如果你有int * foo = (int*)malloc(sizeof(int));,那么你就有一个值指针,因为int 的生命周期从获取存储空间开始。对于像std::string 这样的东西,你需要调用构造函数,所以在你这样做之前它是无效的。
  • 目前没有任何意义。
  • @NathanOliver-ReinstateMonica 该代码没有为 int 对象获取存储空间(它获取没有对象的存储空间),对象仅按照 [intro.object]/1 指定的方式创建跨度>

标签: c++ pointers language-lawyer c++17 object-lifetime


【解决方案1】:

没错。

内存中该位置没有对象。记忆“属于你”。但是,指针是否有效不是由内存分配决定的,而是由它指向的对象的存在决定的。这个指针不指向任何对象,所以它是一个无效的指针。

p0593rX,如果将来采用,会改变这一点,基本上是为你放一个对象。这实际上非常重要,因为目前我能想到的 C++ 中malloc 的任何使用(包括placement new)目前都有未定义的行为。

【讨论】:

  • 其实.... is 所说的新展示位置有效吗?新放置是否需要有效的指针输入? (通常它是指向某个char[] 对象的有效指针)HMM
  • 看来如果指针值无效,那么placement new是不能保证起作用的,因为要调用placement new,需要将指针值复制到::operator new的参数中,它具有实现定义的结果。
  • @Brian 是的!哈。所以 p0593rX 不仅仅是为了好玩 - malloc 在技术上 在 C++ 中是无用的......(提案几乎说 tbf)
【解决方案2】:

这是有道理的。 这是一个“无效的指针值”,因为它不指向对象。

请参阅该部分的后面部分,其中说:

指针值在它所表示的存储达到其存储期限的末尾时变为无效

这意味着不是指针的“值”使它无效,而是它没有指向一个有效的对象。

【讨论】:

  • 您引用的文本谈论的是存储,而不是对象。它似乎与问题中的引号不一致。指针指向一个对象,然后对象被销毁但存储没有释放呢?
  • 那么指针就变成了“无效的指针值”
猜你喜欢
  • 2022-11-10
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2015-07-20
  • 2019-04-02
  • 1970-01-01
相关资源
最近更新 更多