Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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
C++ 是指向对象';“生命周期”;无效指针“;或;指向对象的指针“;?_C++_Pointers_Language Lawyer_C++17 - Fatal编程技术网

C++ 是指向对象';“生命周期”;无效指针“;或;指向对象的指针“;?

C++ 是指向对象';“生命周期”;无效指针“;或;指向对象的指针“;?,c++,pointers,language-lawyer,c++17,C++,Pointers,Language Lawyer,C++17,C++17(草案N4659)规定: 指针类型的每个值都是以下值之一: 指向对象或函数的指针(该指针被称为指向对象或函数),或 超过对象结尾([expr.add])的指针,或 该类型的空指针值([conv.ptr]),或 无效的指针值 以下程序中的/(1)到/(3)和/(4)的a值属于对象生命周期之外分配内存的指针,具体是属于哪一类 #include<new> #include<algorithm> struct S { ~S() { /* Non-trivi

C++17(草案N4659)规定:

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

  • 指向对象或函数的指针(该指针被称为指向对象或函数),或

  • 超过对象结尾([expr.add])的指针,或

  • 该类型的空指针值([conv.ptr]),或

  • 无效的指针值

以下程序中的
/(1)
/(3)
/(4)
a
值属于对象生命周期之外分配内存的指针,具体是属于哪一类

#include<new>
#include<algorithm>

struct S {
    ~S() { /* Non-trivial destructor */ }
};

struct T {
    ~T() { /* Non-trivial destructor */ }
};

int main() {
    void* a = operator new(std::max(sizeof(S), sizeof(T)));
    // (1)
    a = new(a) S;
    static_cast<S*>(a)->~S();
    // (2)
    a = new(a) T;
    static_cast<T*>(a)->~T();
    // (3)
    operator delete(a);   

    void* b = operator new(42);
    // (4)
    operator delete(b);
}
#包括
#包括
结构{
~S(){/*非平凡析构函数*/}
};
结构T{
~T(){/*非平凡析构函数*/}
};
int main(){
void*a=新运算符(std::max(sizeof(S),sizeof(T));
// (1)
a=新的(a)S;
静态_cast(a)->~S();
// (2)
a=新(a)T;
静态_cast(a)->~T();
// (3)
删除操作员(a);
void*b=新操作员(42);
// (4)
操作员删除(b);
}

在我的理解中,指针值在解除分配时变得无效,不是在对象的生命周期结束时,而是在指针值是“指向对象的指针”的情况下,指针值指向哪个对象

以下程序中的
/(1)
/(3)
/(4)
a
值属于对象生命周期之外分配内存的指针,具体是属于哪一类

#include<new>
#include<algorithm>

struct S {
    ~S() { /* Non-trivial destructor */ }
};

struct T {
    ~T() { /* Non-trivial destructor */ }
};

int main() {
    void* a = operator new(std::max(sizeof(S), sizeof(T)));
    // (1)
    a = new(a) S;
    static_cast<S*>(a)->~S();
    // (2)
    a = new(a) T;
    static_cast<T*>(a)->~T();
    // (3)
    operator delete(a);   

    void* b = operator new(42);
    // (4)
    operator delete(b);
}
从分配函数返回的指针值(
a
at
/(1)
b
at
/(4)
)当前未指定,几乎无法根据[basic.component]/3中的分类法对其进行分类,请参阅

在我的理解中,指针值在解除分配时变得无效,不是在对象的生命周期结束时,而是在指针值是“指向对象的指针”的情况下,指针值指向哪个对象


当对象生存时指向的对象。

< P>在基本的运行时概念中,所有C++标准都是<强> BaseDistaby/Sturial.

什么是左值?它需要能够引用尚未创建的对象。(指针也是如此。)

何时不存在创建的对象?它们是否在需要之前出现


对我来说,最好的方法是假设所有对象类型都存在于内存中适合它们的任何地方。这里的许多人告诉我这是疯狂和矛盾的,但从来没有人指出矛盾。

当内存被释放时,指向内存的指针就失效了。当对象不再存在时,指向该对象的指针将变为无效。对于具有析构函数的类型,当其析构函数完成时,该类型的实例(也称为对象)将不再存在。在销毁对象然后释放内存的删除表达式中,当销毁程序完成时,指向该对象的任何指针都将无效,而当释放内存时,指向其底层内存的任何指针都将无效(例如,
operator delete()
函数返回)。AFAIK,
运算符new
返回指向已分配内存块的第一个字节的指针。您可以考虑链接中的注释:“注意:空洞指针不具有指向对象类型的指针,因为空格不是对象类型。 — 结束语”<代码>a和
b
仍然指向内存。即使在物体被摧毁之后。析构函数不会为分配的内存调用
delete
。也许它在所有情况下都是“正式”的“指向对象类型的指针”,但您在这里通过使用
,将概念结合在一起,这重新引入了C风格的
malloc
自由的
-like分配。@JHBonarius前面的句子确实说
void*
是一种“对象指针类型”引用的段落讨论了“指针类型”的每个值,我假设它是“对象指针类型”的一个集合。我完全知道
操作符new
会返回一个指向已分配内存的指针,并且析构函数调用不会取消分配它<代码>
包括在内,以使非分配放置可用
std::free
std::malloc
是在
中声明的,而不是
@Peter“当对象不再存在时,指向该对象的指针将变得无效。”:这基本上是我的问题。但是请注意,“无效指针值”是一个已定义的术语,这将不允许将无效指针值传递给释放函数,这对我来说毫无意义。是的,但它们实际上做了相同的事情
有一个很好的层,因此会抛出一个
bad\u alloc
异常,而不是返回NULL。啊,好的,这很有意义。我假设还保留了允许我对从
操作符new
返回的指针执行的操作,例如,是否始终允许我复制/传递它(为无效指针定义的实现)或将其强制转换为其他对象指针类型(允许在特定目标类型的对象生存期之外)。“指向他们在对象处于活动状态时指向的对象。”不,指向分配的内存空间脚注意味着指针可以指向不在其生命周期内的对象。是的,好的,是的……但
运算符new()
是例外,因为结果指针指向已分配内存部分的第一个字节,该部分已被删除”从来没有“一开始就被一个物体占据过……所以这有点像鸡蛋故事……似乎我们必须理性,直到现实符合标准……这是相反的……我认为标准是不完整的:太严格了。”他们看起来是公正的吗