Разница между оператором new и оператором new []? - PullRequest
3 голосов
/ 17 января 2010

Я перегружен глобальным оператором new / delete / new [] / delete [], но простые тесты показывают, что хотя мои версии new и delete вызываются правильно, выполняется простое распределение массивов и удаляются с помощью new [] и delete [] вызывает вызовы реализаций в newaop.cpp и delete2.cpp.

Например, этот код

int* a = new int[10];

вызывает оператор new [] в newaop.cpp, который, в свою очередь, вызывает мою версию оператора new. Таким образом, кажется, что они перегружены глобально, но почему-то не версии массива. Я что-то упускаю?

РЕДАКТИРОВАТЬ: Моя реализация операторов находится в отдельном проекте, который скомпилирован в библиотеку и связан статически. Оглядываясь назад, это могло бы быть полезно включить в исходный пост, поскольку, вероятно, это как-то связано с этим. Хотя я до сих пор не могу понять, почему затрагиваются только версии массива.

Ответы [ 4 ]

3 голосов
/ 17 января 2010

Я не знаю, как вы перегружены operator new[], но я только что попробовал с MSVC2008:

void* operator new[](size_t size)
{
  return 0;
}

int main()
{
  int* a = new int[5];
}

Приведенный выше код фактически вызывает мою ошибочную реализацию operator new[].

Итак, вот мое предположение: по какой-то причине вам не удалось перегрузить operator new[], и ваша программа использует версию компилятора operator new[], которая опирается на operator new для выделения памяти. Поскольку вы перегружены operator new, ваша реализация вызывается.

0 голосов
/ 17 января 2010

Хорошо, мне удалось взломать это, поэтому я пишу на случай, если кто-то еще наткнется на это.

Причина, по которой оператор не был вызван, заключалась в том, что моя реализация находилась в библиотеке, а не в проекте, который вызывал операторы. На самом деле, поскольку технически вам нужно только включить реализацию операторов, они уже определены глобально, я только определил реализацию операторов в .cpp в моей библиотеке (это был неправильный шаг). Код, очевидно, включал только заголовочные файлы из библиотеки и не имел видимости для реализаций. Более того, Visual Studio, похоже, связал newaop.cpp и delete2.cpp с моим приложением. Эти два файла содержат реализации для оператора new [] и оператора delete [] (бот не для обычного new / delete!). Это, скорее всего, причина, по которой компилятор увидел эти две реализации и выбрал их вместо моей, которая находилась в файле .cpp в библиотеке.

Решением этой проблемы было перенести реализацию моих перегруженных операторов в файл заголовка в библиотеке, который непосредственно включен из моего кода.

0 голосов
/ 17 января 2010

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

0 голосов
/ 17 января 2010

оператор new выделяет один объект и вызывает его конструктор. new [] выделяет n объектов и вызывает n конструкторов.

edit: Наличие нескольких перегрузок new [] и delete [] можно считать немного странным. Откуда компилятор узнает, на какой из них ссылаться? Есть ли шанс, что вы можете опубликовать свои перегрузки? Также вам звонят, если вы не связываете newaop и delete2 внутри (т.е. ваши единственные реализации в exe)?

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