Размещение нового, когда передан недостаточный указатель памяти - PullRequest
1 голос
/ 06 ноября 2011

Мне было просто интересно, как будет действовать размещение new, когда ему передается буфер, которого недостаточно для размещения.Но, похоже, все равно это удается.Вот мой код:

#include <stdio.h>
#include <malloc.h>
#include <new>

class MyClass
{
    public:
        char data;
        char data1;
};


int main() {
    printf("sizeof MyClass: %lu\n", (unsigned long)sizeof(MyClass));

    void *place = malloc(sizeof(MyClass) - 2);

    MyClass *ptr = new (place) MyClass();

    ptr->data = 10;
    ptr->data1 = 20;
    printf("%d\n", ptr->data1); //This seems to have work fine, storing the data as always
}

Это ожидаемое поведение?Кто-нибудь, пожалуйста, объясните, как это работает.Благодарю.

PS: я использую 64-битную систему Ubuntu, компилятор g ++.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2011

Вызов размещения в блоке памяти, который недостаточно велик для этого типа, является неопределенным поведением. Это может (и, вероятно, будет в реальной программе) уничтожить вашу кучу.

Неопределенное поведение не определено, поэтому программа может появиться , чтобы работать как обычно, даже если вы, вероятно, уничтожаете память, которая вам не принадлежит. Ваш простой пример даже не пытается освободить выделенную память, поэтому вы никогда не проверяете кучу, чтобы убедиться, что она повреждена.

2 голосов
/ 06 ноября 2011

Размещение нового не имеет ничего общего с размещением.Он не знает и не заботится о том, насколько велик буфер, который вы передаете - на самом деле его единственная задача - вызывать конструктор объекта, который должен начать выделение (и, вероятно, соответствие) адреса, который вы ему передали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...