Предупреждение, что free недопустимо и имеет неопределенное поведение, способ удалить выделенную память - delete [] mem;
Из-за этого бесполезно делать new затем удалить в цикле, если вы хотите проверить предельный размер выделения, который вам не нужно удалять (и, конечно, не бесплатно)
Если вы хотите узнать максимальный размер непрерывный блок делает начальный malloc , затем realloc в цикле, увеличивая размер до NULL
Например
#include <stdlib.h>
#include <iostream>
int main() {
void * mem = malloc(0);
size_t count = 0;
while ((mem = realloc(mem, (++count)*1024*1024)) != NULL)
;
free(mem);
std::cout << "count: " << --count << "Mb" << std::endl;
}
Обратите внимание, что программа не записывает данные в выделенную память, поэтому я могу выполнить ее на моем Raspberry Pi без убийства , при этом происходит своп:
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra a.cc
pi@raspberrypi:/tmp $ ./a.out
count: 1023Mb
pi@raspberrypi:/tmp $
Использование C ++ new :
#include <stdlib.h>
#include <iostream>
int main() {
char * mem;
size_t count = 0;
try {
while (true) {
mem = new char [(++count)*1024*1024];
delete [] mem;
}
}
catch (std::bad_alloc &) {
}
std::cout << "count: " << --count << "Mb" << std::endl;
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra a.cc
pi@raspberrypi:/tmp $ ./a.out
count: 543Mb
Результат не совпадает, он более реалистичен и соответствует свободной памятиУ меня