PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : malloc/free - Win7 vs WinXP.


noid
2011-04-22, 00:26:58
Moin,

grybel gerade was für Effekte hier zum Tragen kommen:
// CharTest.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;

const char data[3][20] =
{
{"123"},
{"324235"},
{"abc"}
};

int _tmain(int argc, _TCHAR* argv[])
{
char* char_array[50];
int a = 2;

for (int i = 0; i < 50; i++)
{
char_array[i] = NULL;
char_array[i] = (char*)calloc((strlen(data[i%3]) + 1), sizeof(char));
strcpy_s(char_array[i], sizeof(data[i%3]), data[i%3]);
}
int j = 0;
while (1)
{
free(char_array[j]);
char_array[j] = NULL;
char_array[j] = (char*)calloc((strlen(data[j%3]) + 1), sizeof(char));
strcpy_s(char_array[j], sizeof(data[j%3]), data[j%3]);
j++;
j %= 50;
a++;
}
return 0;
}



Führt man den Code aus hängt sich das Programm bei der while-Schleife auf sobald j modulo 50 0 ist (und prinzipiell auch für jedes andere j danach).
Aber(!) nur unter Win7 kompiliert/ausgeführt.
Unter XP läuft das Ding.
Jetzt ist mir beim Debuggen aufgefallen, dass das free den Speicher zwar freigibt aber das erneute *alloc liefert die gleiche Addr. als Start. Beim "2ten" free knallt es dann.

Abseits von std-vectoren,"kein c in c++", boost etc. - warum? :confused:
Der Fehler in diesem Code ist wohl schon seit immer, kommt aber nun zum tragen.

Gast
2011-04-22, 11:13:34
Bei strcpy_s die Größe des Zielspeicherbereichs anzugeben, wie bei calloc() verwendet - und nicht die des Quellespreicherbereichs. Also "strlen(data[foo%3]) + 1" anstatt "sizeof(data[foo%3])".

noid
2011-04-22, 11:59:12
Bei strcpy_s die Größe des Zielspeicherbereichs anzugeben, wie bei calloc() verwendet - und nicht die des Quellespreicherbereichs. Also "strlen(data[foo%3]) + 1" anstatt "sizeof(data[foo%3])".

Ui, 7 Jahre alter Bug - Dank Win7 entdeckt ^^
Ja, macht Sinn.

Und funktioniert dann auch...

("Aber VisualStudio6 hat da immer funktioniert und da waren nie Fehler :freak:)

edit: solche Probleme haben viele im Netz, aber dass es der Speicherzugriff zwischendrin ist... awesome.