Simple code (below, malloc()
/free()
sequence being run in 100 threads) crashes on any Windows OS I tried it to run.
Any help would be greatly appreciated.
Maybe using some compiler directive can help?
We build the executable in VS2017 in Release/x64; the executable file crashes on any Windows platform I tried after several minutes of running.
I tried building with VS2015 as well but it doesn't help.
The same code on Linux works fine.
Actually, problem is more serious than it looks; we faced the situation when our server code crashes several times a day in a production environment without any reason (when user calls' number exceeds a certain value). We tried to nail down the issue and created simplest solution that reproduces the problem.
Archive with VS project is here.
VS says that command line is:
/Yu"stdafx.h" /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc140.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\MallocTest.pch"
Code:
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <conio.h>
using namespace std;
#define MAX_THREADS 100
void task(void) {
while (true) {
char *buffer;
buffer = (char *)malloc(4096);
if (buffer == NULL) {
cout << "malloc error" << endl;
}
free(buffer);
}
}
int main(int argc, char** argv) {
thread some_threads[MAX_THREADS];
for (int i = 0; i < MAX_THREADS; i++) {
some_threads[i] = thread(task);
}
for (int i = 0; i < MAX_THREADS; i++) {
some_threads[i].join();
}
_getch();
return 0;
}
new
is used (it actually still calls the same_malloc_base
). Callstack ends withntdll.dll!RtlpLowFragHeapAllocFromContext(); tdll.dll!RtlpAllocateHeapInternal(); ucrtbase.dll!_malloc_base()
– user7860670ntdll.dll!RtlpLowFragHeapAllocFromContext(); tdll.dll!RtlpAllocateHeapInternal(); ucrtbase.dll!_malloc_base()
– Jabberwocky