Указатели на выделенную память вне времени жизни объекта "неверный указатель [s]" или "указатель [s] на объект"? - PullRequest
4 голосов
/ 26 октября 2019

C ++ 17 (черновик N4659) [basic.compound] / 3 говорит:

Каждое значение типа указателя является одним из следующих:

  • указатель на объект или функцию (говорят, что указатель указывает на объект или функцию), или

  • указатель за концом объекта([expr.add]) или

  • значение нулевого указателя ([conv.ptr]) для этого типа, или

  • anневерное значение указателя.

К какой из этих категорий относятся указатели на выделенную память вне времени жизни объектов, в частности значения от a в // (1) до // (3) и bв // (4) в следующей программе?

#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] на объект", на , на какой объект они указывают?

Ответы [ 2 ]

1 голос
/ 27 октября 2019

К какой из этих категорий относятся указатели на выделенную память вне времени жизни объектов, в частности значения от a при // (1) до // (3) и b при // (4) в следующей программе?

Значения указателя, возвращаемые функциями распределения (a в // (1) и b в // (4)), в настоящее время не указаны, и их едва можно классифицировать в соответствии с таксономией в [basic.compound] / 3, см. https://groups.google.com/a/isocpp.org/d/msg/std-discussion/4NQawIytVzM/eMKo2AJ9BwAJ

В моем понимании значение указателя становится недействительным при освобождении, а не по истечении времени жизни объекта, но если значения указателя равны "pointer [s] на объект ", на какой объект они указывают?

На объект, на который они указывали, когда объект был жив.

0 голосов
/ 27 октября 2019

Все стандарты C ++ представляют собой непристойный беспорядок , когда речь идет о базовой концепции времени выполнения.

Что такое lvalue? Он должен иметь возможность ссылаться на еще не созданный объект. (То же самое для указателей.)

Когда не существует созданного объекта? Появляются ли они непосредственно перед тем, как они понадобятся?

Для меня лучшим подходом было бы предположить, что все типы объектов существуют в памяти везде, где они подходят. Многие люди здесь говорили мне, что это безумиеи противоречивый, но никто никогда не указывал на противоречие.

...