webForumDet fria alternativet

Damage after normal block

7 svar · 193 visningar · startad av pettsson

pettssonMedlem sedan jan. 20021 122 inlägg
#1

Har nu börjat leka med pekare... :r men när jag kör min kod så får jag följande felmeddelande:

Debug Error!

*filnamn*

DAMAGE: after Normal block on (#44) at 0x004800F0

Vad betyder det? någon permanent skada på datorn? Meddelandet kommer bara upp om jag utför delete på det pekare jag skapat, annars fungerar programmet som det ska.

developerMedlem sedan aug. 2001458 inlägg
#2

Du har en bug i ditt program. Det är Visual Studio som lägger in lite hjälp åt dig som kontrollerar om du skriver på ett ställe i minnet som du inte får.

Min gissning är att du skriver utanför ett allokerat block (exempelvis du allokerar 100 Bytes, men skriver mer än det)

pettssonMedlem sedan jan. 20021 122 inlägg
#3

koden ser ut så här:

#include "iostream"
using namespace std;

int main()
{
	char * Palindrom;
	Palindrom = new char;
	char * BakOchFram;
	BakOchFram = new char;
	char * TempChar;
	TempChar = new char;
	int b = 0;
	int c = 0;

	cin.get(Palindrom, 128);
	cout << endl;

	delete Palindrom;
	delete BakOchFram;
	delete TempChar;
	return 0;

}

"lärde" mig pekare för ungefär 1 timma sen, så nåt fel bör jag väl ha gjort... :stud

Marcus EMedlem sedan maj 20021 466 inlägg
#4

"Palindrom = new char;"
Du allokerar minne för ETT tecken och läser in 128. Det går ju inte.

Använd istället detta för att allokera en sträng på 128 tecken.
"Palindrom = new char[128];"

Gör samma sak med de andra variablerna.

Du kan också allokera på stacken genom att använda följande. Då ska du inte radera det med delete senare.
"char Palindrom[128];"

pettssonMedlem sedan jan. 20021 122 inlägg
#5

meningen var att Palindrom skulle vara lika stor som antalet tecken använderaren skriver in... lägger man till [128] så kommer den skriva ut strängen och 128 - stränglängden =-tecken...

ViktorMedlem sedan aug. 20021 752 inlägg
#6

Som jag har skrivit nu så kommer variabeln Palindrom att bli lika stor som det som har skrivits in av användaren.

#include "iostream"
using namespace std;

int main()
{
	[B]char* buffer=new char[128];[/B]
	char * Palindrom;
	[B]//Palindrom = new char;[/B]
	char * BakOchFram;
	BakOchFram = new char;
	char * TempChar;
	TempChar = new char;
	int b = 0;
	int c = 0;

	cin.get([b]buffer[/b], 128);
	cout << endl;
[B]
	Palindrom=new char[strlen(buffer)];
	strcpy(Palindrom,buffer);
	delete buffer[]; //Glöm inte bort att ha [] när du deletar en array
[/B]

	for (b = (strlen(Palindrom) - 1); b >= 0; b--) // b = stränglängd och körs till b = 0, b = b - 1
	{
		TempChar[0] = Palindrom[ b]; // TempChar pos 0 = Palindrom pos b
		BakOchFram[c] = TempChar[0]; // BakOchFram pos c = TempChar pos 0
		c++;
	}

	if (Palindrom == BakOchFram)
	{
		cout << "Det var ett Palindrom";
	}
	else
	{
		cout << "Det var inte ett Palindrom";
	}

	cout << "\n\n";

	cout << Palindrom << "\n";
	cout << BakOchFram << "\n\n";

	
[B]	//delete Palindrom;
	delete Palindrom[];
[/B]
	delete BakOchFram;
	delete TempChar;
	return 0;

}

Hoppas det var detta som du vill åstadkomma :)
OBS! Det kommer ändå inte att fungera eftersom BakOchFram fortfarande bara är 1 char lång.

/Viktor

pettssonMedlem sedan jan. 20021 122 inlägg
#7

tack! ett problem med det här bara... den ger syntax error när jag delete:ar arrayer, med delete arraynamn[], "cannot delete objects that are not pointers"

developerMedlem sedan aug. 2001458 inlägg
#8

prova "delete[] array;"

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)