Вы перегружаете неправильный оператор.
char *p = new ('$') char[100];
вызывает operator new[]
, а не operator new
, потому что это выражение нового массива.
Итак, вы хотите перегрузить
void *operator new[](size_t sz,int setvalue)
не
void *operator new(size_t sz,int setvalue)
На практике вам, вероятно, следует перегружать оба (вы можете просто позвонить opearator new
из operator new[]
).
Вам также необходимо всегда перегружать operator delete
и operator delete[]
при перегрузке operator new
и operator new[]
соответственно.
Я не знаю, что делает memoryWarning();
, но помните, что operator new
(и operator new[]
) без спецификация не-генерирующего исключения должна генерировать исключение, которое может быть перехвачено catch(std::bad_alloc)
в случае неудачного выделения. Возвращение нулевого указателя не допускается.
Наконец, перегрузка operator new
, которую вы пытаетесь сформировать здесь, не работает так, как вы намереваетесь.
malloc
не создает никаких объекты в памяти, которую вы выделяете. memset
(если это даже технически разрешено здесь) запишет символ в эту память. Затем новое выражение создаст в этой памяти массив char
.
Вновь созданные объекты не принимают значение, которое ранее имело место в памяти, в которую они помещены. Вместо этого значения char
элементов массива будут неопределенны , и вам нужно будет снова их инициализировать.
Правильный способ сделать то, что вы пытаетесь здесь, - не перегружать operator new
, но инициализировать массив вручную и желательно не с помощью стандартной библиотечной функции C memset
, если у вас нет веских оснований для его использования. Вместо этого используйте, например, std::fill
(требуется #include<algorithm>
):
char *p = new char[100];
std::fill(p, p+100, '$');
Или лучше используйте std::string
(требуется #include<string>
):
std::string str(100, '$');
Указатель на базовый Массив char
можно получить из str.data()
.
Также не используйте NULL
. Начиная с C ++ 11 существует nullptr
, который всегда безопаснее в использовании. Никогда не используйте NULL
, всегда используйте nullptr
.