Я уже не знаю, что думать и что делать. Код Next компилируется нормально в обеих IDE, но в случае VC++ он вызывает странные сообщения о повреждении кучи, такие как:
"Windows сработала точка останова в Lab4.exe.
Это может быть связано с повреждением кучи, что указывает на ошибку в Lab4.exe или любой из загруженных библиотек DLL.
Это также может быть связано с тем, что пользователь нажал F12, когда Lab4.exe имеет фокус.
В окне вывода может быть больше диагностической информации."
Это происходит при выполнении функции Task1_DeleteMaxElement и я оставляю там комментарии.
Ничего подобного не происходит, если компилируется в Borland C++ 3.1 и все такое работать, как ожидалось.
Итак... что не так с моим кодом или VC++?
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <memory.h>
void PrintArray(int *arr, int arr_length);
int Task1_DeleteMaxElement(int *arr, int arr_length);
int main()
{
int *arr = NULL;
int arr_length = 0;
printf("Input the array size: ");
scanf("%i", &arr_length);
arr = (int*)realloc(NULL, arr_length * sizeof(int));
srand(time(NULL));
for (int i = 0; i < arr_length; i++)
arr[i] = rand() % 100 - 50;
PrintArray(arr, arr_length);
arr_length = Task1_DeleteMaxElement(arr, arr_length);
PrintArray(arr, arr_length);
getch();
return 0;
}
void PrintArray(int *arr, int arr_length)
{
printf("Printing array elements\n");
for (int i = 0; i < arr_length; i++)
printf("%i\t", arr[i]);
printf("\n");
}
int Task1_DeleteMaxElement(int *arr, int arr_length)
{
printf("Looking for max element for deletion...");
int current_max = arr[0];
for (int i = 0; i < arr_length; i++)
if (arr[i] > current_max)
current_max = arr[i];
int *temp_arr = NULL;
int temp_arr_length = 0;
for (int j = 0; j < arr_length; j++)
if (arr[j] < current_max)
{
temp_arr = (int*)realloc(temp_arr, temp_arr_length + 1 * sizeof(int)); //if initial array size more then 4, breakpoint activates here
temp_arr[temp_arr_length] = arr[j];
temp_arr_length++;
}
arr = (int*)realloc(arr, temp_arr_length * sizeof(int));
memcpy(arr, temp_arr, temp_arr_length);
realloc(temp_arr, 0); //if initial array size is less or 4, breakpoint activates at this line execution
return temp_arr_length;
}
malloc
иnew
были свои собственные распределители, и это было причиной того, что при компиляции с /MT вы не могли освободить указатель в DLL, когда она была размещена в другой DLL. - person paercebal   schedule 18.05.2012