PDA

View Full Version : سوال: malloc.c



amybvkht
سه شنبه 10 مرداد 1391, 00:29 صبح
سلام .پروژه ام مشکل داره موقع اجرا این پیغام میده :
This may be due to a corruption of the heap, which indicates a bug in s2.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while s2.exe has focus.
The output window may have more diagnostic information.
همزمان با این صحفه malloc.c رو هم باز میکنه
تو محیط visaul stdio 2010هست
اینم اون جایی که مشکل داره

void Cscan::exploreDirectory(LPSTR s){
Cprocess obj_2;
int ln=strlen(s);
strcat(s,"\\*");
WIN32_FIND_DATA FindFileData;
HANDLE hfind;
hfind=FindFirstFile(LPCWSTR(s),&FindFileData);
LPSTR str=(char *)malloc(260);
strcpy(str,s);

int len;
do{
str[ln+1]=0;
strcat(str,(constchar *)FindFileData.cFileName);
if(!strcmp((constchar *)FindFileData.cFileName,".")||!strcmp((constchar *)FindFileData.cFileName,"")||!strcmp((constchar *)FindFileData.cFileName,".."))continue;
if(checkDir(str)){
exploreDirectory(str);
}
else{
strcat(str,(constchar *)FindFileData.cFileName);
obj_2.process(str);
}
}while(FindNextFile(hfind,&FindFileData));
FindClose(hfind);
}

ممنونم میشم دلیلش بگید

tdkhakpur
سه شنبه 10 مرداد 1391, 09:08 صبح
اول از همه حافظه رو که میگیری آخر کار به سیستم برگردون . دوم اینکه از کجا میدونی طول رشته رو که به حافظه جدید میدی حداکثر 260 تاست.
LPSTR str=(char *)malloc(260);
strcpy(str,s);

amybvkht
سه شنبه 10 مرداد 1391, 09:57 صبح
حافظه رو هم آزاد کردم هر مقداری هم بهش تخصیص میدم باز فرقی نمیکنه همون مشکل هست

#target
چهارشنبه 11 مرداد 1391, 23:02 عصر
بجای malloc از تابع HeapAlloc استفاده کن ببین چی میشه

LPSTR str=(char *) HeapAlloc(GetProcessHeap() , HEAP_ZERO_MEMORY , 260);

amybvkht
پنج شنبه 12 مرداد 1391, 10:17 صبح
بجای malloc از تابع HeapAlloc استفاده کن ببین چی میشه

LPSTR str=(char *) HeapAlloc(GetProcessHeap() , HEAP_ZERO_MEMORY , 260);

این دستور رو جایگزین کردم اما باز همون مشکل با این تفاوت که این بار از خط

if ( !InitializeCriticalSectionAndSpinCount(pcs, _CRT_SPINCOUNT) )


از فایل mlock.c

#target
پنج شنبه 12 مرداد 1391, 23:21 عصر
مطمنید ایراد از جای دیگه نیست ؟

این چیه ؟
Cprocess obj_2;

amybvkht
جمعه 13 مرداد 1391, 16:38 عصر
مطمنید ایراد از جای دیگه نیست ؟

این چیه ؟
Cprocess obj_2;

سلام .یه کمی عوضش کردم اون مشکل حل شد اینجوری:

void Cscan::exploreDirectory(LPSTR s){
Cprocess obj_2;
int ln=strlen(s);
strcat(s,"\\*");
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind=FindFirstFile(LPCWSTR(s),&FindFileData);
char str[2600];
strcpy(str,s);

int len;
do{
str[ln+1]=0;
strcat(str,(constchar *)FindFileData.cFileName);
if(!strcmp((constchar *)FindFileData.cFileName,".")||!strcmp((constchar *)FindFileData.cFileName,"")||!strcmp((constchar *)FindFileData.cFileName,".."))continue;
if(checkDir(str)==true){
exploreDirectory(str);
}
else{

obj_2.process(str);
}
}while(FindNextFile(hFind,&FindFileData)!=0 && hFind != INVALID_HANDLE_VALUE);

FindClose(hFind);
}


اما حالا این پیغام میده :
Unhandled exception at 0x77ee8c72 in test2.exe: 0xC0000005: Access violation writing location 0x00120f98.
اونم هر چی هست به خاطر این خط :
strcat(str,(constchar *)FindFileData.cFileName);
خیلی ممنون میشم واقعااگه بگید دلیلش چیه:ناراحت:

amybvkht
جمعه 13 مرداد 1391, 16:46 عصر
Cprocess obj_2;
یه object از یه کلاس دیگه اس که ایجا از شی process اون کلاس در ایجا استفاده شده .ولی مطمئنم دلیل همون
strcat(str,(const char *)FindFileData.cFileName);
چون این کد رو نوشتم که مطمئن شدم

#include <windows.h>
#include <queue>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <winbase.h>
#include <process.h>
#include <winreg.h>
#include <tlhelp32.h>
#include <ctime>
#include <conio.h>
using namespace std;
void main(){
char path[2000]="c:";
char str[2000];
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind=FindFirstFile(LPCWSTR(path),&FindFileData);
strcpy(str,path);
strcat(str,(const char *)FindFileData.cFileName);
cout<<str;
getch();
}