Chyba při odalokování pomocí delete – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Chyba při odalokování pomocí delete – C / C++ – Fórum – Programujte.comChyba při odalokování pomocí delete – C / C++ – Fórum – Programujte.com

 

16. 3. 2013   #1
-
0
-

Potřebuji pole pro třídu Fronty(queue), to jsem alokoval takhle:

queue *p = new queue[10];

To funguje, dokonce dokážu pracovat s více třídami tak jak potřebuji, ale problém je v tom, že při odalkokaci mi hází VS chybu a já nevím kde chyba je. Odalokovávám takhle:

delete [] p;

Chyba je takováto: 

Celkový kód vypadá nějak takhle:

#include <iostream>
#include <string.h>
#include "queue.h"

using namespace std; void main(){ queue *p = new queue 1]; delete [] p; system("pause"); }

A ještě přidávám queue.cpp:

#include "queue.h"

queue::queue(){

}

void queue::AllocSize(int capacity){
	mCapacity = capacity;
	mTail = 0;
	mHead = 0;
	mCanBeEmpty = true;
	mCanBeFull = capacity == 0;
	mPole = new int[mCapacity];
}

bool queue::Put(int arg){
	if (Full())
		return false;

	mCanBeFull = true;
	mCanBeEmpty = false;
	mPole[mTail] = arg;
	mTail = ++mTail % mCapacity;
}

int queue::Get(){
	if (Empty())
		return -1;

	mCanBeFull = false;
	mCanBeEmpty = true;
	int temp = mHead;
	mHead = ++mHead % mCapacity;
	return mPole[temp];
}

bool queue::Full(){
	return (mTail == mHead) && mCanBeFull;
}

bool queue::Empty(){
	return (mTail == mHead) && mCanBeEmpty;
}

queue::~queue(void){
	delete [] mPole;
}

Vůbec nevím kde je chyba, přitom když queue vyměním za int, nebo double, projede program bez problémů, bez chyby.

Nahlásit jako SPAM
IP: 78.80.38.–
KIIV
~ Moderátor
+43
God of flame
16. 3. 2013   #2
-
0
-

Hele ted nejak nechapu, co ma ta trida spolecneho s tim co mas v main...  ta chyba, kterou to hlasi je taky nejaka vymluvna...

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
16. 3. 2013   #3
-
0
-

#2 KIIV
Pro tu třídu alokuji pole, tak jsme si říkal, jestli chyba nebude třeba tam, co ja vím. Minule, když jsme sem dával příspěvek, mě tu dupali za to, že jsme nedal všechny zdrojáky a jestli si je mají cucat z prstu. Co se týče chyby, můžu přidat jen, že se mi otevře nějaký soubor dbgdel.cpp na řádku 52.

/***
*dbgnew.cpp - defines C++ scalar delete routine, debug version
*
*       Copyright (c) Microsoft Corporation.  All rights reserved.
*
*Purpose:
*       Defines C++ scalar delete() routine.
*
*******************************************************************************/

#ifdef _DEBUG

#include <cruntime.h>
#include <malloc.h>
#include <mtdll.h>
#include <dbgint.h>
#include <rtcsup.h>

/***
*void operator delete() - delete a block in the debug heap
*
*Purpose:
*       Deletes any type of block.
*
*Entry:
*       void *pUserData - pointer to a (user portion) of memory block in the
*                         debug heap
*
*Return:
*       <void>
*
*******************************************************************************/

void operator delete(
        void *pUserData
        )
{
        _CrtMemBlockHeader * pHead;

        RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));

        if (pUserData == NULL)
            return;

        _mlock(_HEAP_LOCK);  /* block other threads */
        __TRY

            /* get a pointer to memory block header */
            pHead = pHdr(pUserData);

             /* verify block type */
ZDE SE JE ASI PROBLEM --> _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

            _free_dbg( pUserData, pHead->nBlockUse );

        __FINALLY
            _munlock(_HEAP_LOCK);  /* release other threads */
        __END_TRY_FINALLY

        return;
}

#endif  /* _DEBUG */
Nahlásit jako SPAM
IP: 78.80.38.–
crazy
~ Moderátor
+10
Grafoman
16. 3. 2013   #4
-
0
-

Co to píše za chybu?

Nahlásit jako SPAM
IP: 147.32.31.–
All you need is vision and time.
KIIV
~ Moderátor
+43
God of flame
16. 3. 2013   #5
-
0
-

no me slo hlavne o:

double *p = new double[1]; delete [] p;

to nema vubec nic spolecnyho s tou tridou queue... pak uz akorat ze queue je ciste pro inty.. neni to udelany jako sablona tak musis proste pri kazdym jinym typu udelat jinou tridu

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
16. 3. 2013   #6
-
0
-

#4 crazy
Screen chyby je v 1. příspěvku, pokud tě zajímá kde v k´du toho souboru, tak jsem to označil "ZDE SE JE ASI PROBLEM -->", stačí, když očima pojedeš odspodu nahoru.

Nahlásit jako SPAM
IP: 78.80.38.–
16. 3. 2013   #7
-
0
-

#5 KIIV
jej sorry, moje chyba. misto double tam davam prave queue. Zkopíroval jsem omylem testovací skript. Omlouvam se melo tam byt: 

	queue *p = new queue[1];
	delete [] p;
Nahlásit jako SPAM
IP: 78.80.38.–
KIIV
~ Moderátor
+43
God of flame
16. 3. 2013   #8
-
0
-

potrebujes vicero tech front?

kazdopadne pak volas konstruktor a destruktor, nicmene v destruktoru nekontrolujes, jestli mas neco alokovanyho ....

dokonce ani neinicializujes zadny atribut tridy v konstruktoru, ale az v ty metode AllocSize

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
16. 3. 2013   #9
-
0
-

#8 KIIV
Prave, ze potrebuji vice front a navic nevim kolik jich budu potrebovat. AllocSize() původně byl konstruktor, ale queue(10)[10] dávalo chybu, proto jsem to začal volat jinou funkcí. Chceš mi teda říct, že chybu mi dělá destruktor? Pokud vím, tak new vezme určitou paměť a delete ji odevzdává a je jedno, jestli v ní něco je nebo tam není vůůbec nic, nepletu se?

Nahlásit jako SPAM
IP: 78.80.38.–
KIIV
~ Moderátor
+43
God of flame
16. 3. 2013   #10
-
0
-

#10 crazy
mel by se zavolat defaultni konstruktor pro kazdou polozku

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
zlz
~ Anonymní uživatel
634 příspěvků
16. 3. 2013   #11
-
0
-

Jde o to, že ty hodnoty inicializuješ jen v AllocSize.

Takže když použiješ jen new/delete, bez AllocSize mezi nimi, tak ty hodnoty zůstanou neinicializované a ten destruktor vyvolaný při delete pak pracuje s neplatným mPole.

Zajisti aby ten objekt byl správně inicializovaný (nejlépe konstruktorem).

Nahlásit jako SPAM
IP: 78.156.159.–
KIIV
~ Moderátor
+43
God of flame
16. 3. 2013   #12
-
0
-

 Treba neco takoveho funguje: 

#include <iostream>

using namespace std;

class test_constructor {
  public:
    test_constructor():pocet(0) { cout << "Constructor without parameter, default value is: " << pocet << endl; }
    test_constructor(int x):pocet(x) { cout << "Constructor with parameter: "<< pocet << endl; }
    ~test_constructor() { cout << "Destructor\n"; }
  private:
    int pocet;
};

int main(int argc, char* argv[])
{
  test_constructor arr[10] = {1,2,3,4,5,6,7,8,9,10};
}

ale s new se to neda .. to zavola defaultni konstruktory

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 107 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý