עבור לתוכן

הקצאת זיכרון בC++

Featured Replies

פורסם

הכול בסדר שאני מקצה זיכרון אבל שאני מנסה לשחרר אותו זה עושה לי בעיות

עשיתי את זה בתוך מחלקה בבונה של המחלקה עשיתי


str = new char[20];

ובהורס


delete str;

מה הבעיה?

זה כתב לי

Windows has triggered a breakpoint in PhoneBook.exe.

This may be due to a corruption of the heap, and indicates a bug in PhoneBook.exe or any of the DLLs it has loaded.

The output window may have more diagnostic information

פורסם

תעשה:

delete [] str;

פורסם

באיזה קומפיילר אתה משתמש?

ניחוש פרוע - אתה מוחק את הזיכרון הזה ביותר ממקום אחד, או שזו בעיה אחרת לגמרי.

delete בלי ה- [] לא אמור להפריע כאשר מדובר ב- basic type.

פורסם
  • מחבר

לא עוזר

אני לא מוחק ביותר ממקום אחד

אני משתמש Visual C++ 2005

פורסם

האם הגדרת את str כפוינטר?

char* str = new size[20];
delete []str;

פורסם
  • מחבר

כן

פורסם

מנסיון רב עם הקצאות בויז'ואל 2005....בד"כ כלל שהתוכנית נופלת בעת מחיקת ההקצאות זה מכיוון שבמערך שהקצת דינאמית גלשת מהזיכרון.

תבדוק בכל התוכנית שאין שום גלישות....היו לי הרבה בעיות דומות .

קודים שהיו תמימים למראה עם פקודות delete לא מסובכות, נפלו לי, הכל בעיות בגלישה של המערך שהוקצה.

בנוסף, תבדוק אם ההקצאה עבדה לך (נדמה לי שאם היא נכשלה היא מחזירה NULL לפוינטר).

פורסם

לא עוזר

אני לא מוחק ביותר ממקום אחד

אני משתמש Visual C++ 2005

אז נשארה לך האפשרות השניה

או שזו בעיה אחרת לגמרי.

Heap corruption זה לא סתם access violation, זה בדר"כ כשאתה עושה משהו הרבה יותר גרוע. buffer overflow למשל.

יכול להיות שהמחרוזת שאתה שם שם יותר ארוכה מ- 20 תוים, או שהיא לא מסתיימת ב- null?

אם תפרסם את הקוד, יהיה יותר קל להבין מה קורה שם.

פורסם
  • מחבר

ההקצאה הצליחה זה לא הבעיה


class String
{
char *str;
public:
String(const char *str2)
{
str = new char[strlen(str2)];
if(!str)
throw "error occord";
strcpy(str,str2);
}
~String()
{
delete []str;
}
char* GetString(){
return str;
}
void operator=(char* str2){
strcpy(str,str2);
}
void operator=(String str2){
strcpy(str,str2.GetString());
}
void operator+=(char* str2)
{
strcat(str,str2);
}
char &operator[](int i)
{
return str[i];
}
friend std::ostream &operator<<(std::ostream &out,String str);
};
std::ostream &operator<<(std::ostream &out,String str)
{
out<<str.str;
return out;
}

פורסם

יופי, יש שם כמה בעיות:

1) אתה לא מקצה מקום ל- \0.

2) כשאתה משתמש בOPERATOR=, += אתה לא מקצה מקום חדש.

3) האופרטורים צריכים להחזיק string & כדי שתוכל לשרשר אותם. הם אמורים לקבל גם CONSTים.

4) getString צריך להחזיר גם CONST.

5) OPERATOR>> של COUT אמור לקבל רפרנס לקבוע.

פורסם

בנוסף, תבדוק אם ההקצאה עבדה לך (נדמה לי שאם היא נכשלה היא מחזירה NULL לפוינטר).

הממ לא.. אם ההקצאה נכשלה נקרא exception... אל אם אתה משתמש בהקצאה דינאמית עם nothrow אז זה דומה ל- c ובכישלון מוחזר NULL.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים