Keresés
Hírlevél
 
Kiemelt témák
»Hogy viszonyul ehhez a család?
»Legjobb metodika emberi relációk tárolására
»A programozó hibája, hogy törik a programját?
»Jogosultság kezelés mezőszinten
Állás/munka
»Wordpress szakértőt keresünk
»Kamu álláshirdetők listája
»Front-end fejlesztő / Sitebuilder
»DataStore Developer
»PHP programozó, webfejlesztő munkát keres
» több téma
Tudástár
Oldalon keresés 8x írja ki az eredményt
?XML-ből sok szövegmező
?Input mezőből visszakapott adat probléma
TinyMCE és az ékezetek
?Rengeteg hasonló kép betöltése gyorsan (PHP)
Ékezetes kar. nem minden táblában jól
?Shelltreeview gond
Grafikon rajzolás probléma
?Onclick= php függvény
?Egyenes megrajzolása
?Access-ből adott xml fájl kinyerése
Listázás időpont szerint
Exportálás változó könyvtárba
*Link eredményének kiolvasása
Imagemapre képet
» több téma
Társalgó
»A programozásból jól meg lehet élni?
»MFC tanulás
»Könyvet adok-veszek
»Hogy viszonyul ehhez a család?
»Nintendo wii
»Letölthető az új Rad Studio XE és Delphi XE
»Weblap véleményezés
»Játékmotor elmélet
»Informatikai bulvárlap
»Delphi-ről C++-ra váltás
» több téma
ASP  |  C#  |  C++  |  CSS  |  Delphi  |  Flash  |  HTML  |  Java  |  JavaScript  |  Pascal  |  Perl  |  PHP  |  Python  |  Visual Basic  |  Visual C++  |    »    

Tudástár

»

Memória szivárgás,de hol és miért?

»

Memória szivárgás,de hol és miért?

nyitotta: Kumar, idő: 2010.03.14., moderátor: moderator
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben Nyomtatható verzió

Kategóriák:Programozási nyelvek » C++

Sorrend:
Időzóna:
Blokkméret:
Van egy c++ kódom, ami sztem már jól működik de a netes fordító szerint még vhol megy el memória, de nem írja hogy hol és én már nem tudok rájönni.
Mielőtt beleolvasnátok a kódba leírom, hogy a header fájlt és a main függvényt nem én írtam, azt a tesztekhez adták szóval ott ne keressetek hibát mert azt nem is tudom átírni. Egyedül a tagfüggvényeket írtam én szóval ott lesz vmi rosszul megírva:

Header:
/**
 * Dinamikus valós vektor.
 * A konstruktor a statikus tagokból inicializál
 */

class Vektor {
    double *pVec;               // vektor elemeit tartalmazó din. memóriaterület cime
    int nElem;                  // vektor elmeinek száma
public:
    static int defMeret;        // vektor alapértelmezett mérete
    static double defErtek;     // vektor elemeinek alepértelmezett kezdőértéke

    /// Kontsruktor.
    /// @param n     - vektor mérete
    /// @param ertek - kezdőérték
    /// default: statisus változókból inicializál
    Vektor(int n = defMeret, double ertek = defErtek) {
        nElem = n;
        pVec = new double[nElem];
        for (int i = 0; i < nElem; i++)
            pVec[i] = ertek;
    }

    /// Másoló konstruktor.
    Vektor(const Vektor&);
   
    /// Destruktor.
    ~Vektor();

    /// Méret lekérdezése.
    int getElemNum() const { return nElem; }

    /// Értékadó operátor
    Vektor& operator=(const Vektor&);

    /// Indexoperátor.
    double& operator[](int);

    /// Szorzás: Valós * Vektor
    friend Vektor operator*(double, Vektor&);
};

Ezt a részt írtam én.Vhol itt lesz a hiba.
CPP:
#include <stdlib.h>
#include <crtdbg.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <malloc.h>
#include <math.h>
#include "vektor.h"

int Vektor::defMeret=8;
double Vektor::defErtek=-23.0;

Vektor::~Vektor()
{
delete[] pVec;
}

Vektor::Vektor(const Vektor& op)
{
delete[] pVec;
nElem=op.nElem;
pVec=new double(nElem);
for(int k=0;k<nElem;k++)
{
pVec[k]=op.pVec[k];
}
}


Vektor& Vektor::operator =(const Vektor& op)
{
delete[] pVec;
nElem=op.nElem;
pVec=new double[nElem];
for(int i=0;i<nElem;i++)
{
pVec[i]=op.pVec[i];
}
return *this;
}


double& Vektor::operator [](int k)
{
if(k<0 || k>=nElem)
throw "Hiba!";
return pVec[k];
}

Vektor operator*(double k,Vektor& op)
{
for(int i=0;i<op.nElem;i++)
op.pVec[i]=op.pVec[i]*k;
}

Main függvény:

/*
 * vektorMain.cpp
 *
 * Tesztprogram a Vektor osztály kipróbálásához
 */

#ifdef _MSC_VER
 #define _CRTDBG_MAP_ALLOC
 #include <stdlib.h>
 #include <crtdbg.h>
#endif

#include <iostream>
#include <iomanip>
#include "vektor.h"

using namespace std;

int main() {
  try {
    // Konstruktorok és az indexelés tesztje
    Vektor v0;
    cout << "v0 merete: "<< v0.getElemNum() << " v0[0]: " << v0[0] << endl;

    Vektor v1(5, -1), v2(6, 0);
    cout << "v1 merete: "<< v1.getElemNum() << " v1[4]: " << v1[4] << endl;

    Vektor v3 = v2;
    cout << "v3 merete: "<< v3.getElemNum() << " v3[5]: " << v3[5] << endl;
   
    // indexelési hiba 1. teszt
    try {
       v3[6];
       cout << "Hoppa" << endl;
    } catch (const char *) {
       cout << "Jol van" << endl;
    }
    // indexelesi hiba 2. teszt
    try {
       v3[-1];
       cout << "Hoppa2" << endl;
    } catch (const char *) {
       cout << "Jol van2" << endl;
    }

    // Beolvasa n-et (egész)
    int n; cin >> n;
    Vektor::defMeret = n;   // ez lesz a default méret
    // Beolvassa a default kezdőértéket
    cin >> Vektor::defErtek;
    // Beolvas még egy egész értéket (ezzel kicst módosít majd)
    int k = 0; cin >> k;

    // Létrehozunk egy 4xn-es mátrixot default értékekkel;
    const int m = 4;
    Vektor vt[m];

    cout << fixed;
    for (int i = 0; i < m; i++) {
        // Értékadás próbája
        v0 = vt[i];
        for (int j = 0; j < n; j++)
           v0[j] = v0[j] * k++;

        cout << "vt[" << i << "](" << v0.getElemNum() << "): ";
 
        // Szorzás probája
        vt[i] = 10 * v0;
        for (int j = 0; j < n; j++)
           cout << setw(8) << setprecision(0) << vt[i][j];
        cout << endl;
    }
  } catch (...) {   // mindent elkapunk
    cout << "Nagy baj van" << endl;
  }
#ifdef _CRTDBG_MAP_ALLOC
  _CrtDumpMemoryLeaks();  // ellenőrzi, hogy volt-e memóriaszivárgás
#endif
  return 0;
}

És a kimenet:

v0 merete: 8 v0[0]: -23
v1 merete: 5 v1[4]: -1
v3 merete: 6 v3[5]: 0
Jol van
Jol van2
vt[0](8): Nagy baj van

Előre is köszi!!
A masolo konstruktorban miert torlod pVec-et..?
Memória szivárgás megakadályozása céljából, de akkor ezek szerint nem kellene ott lennie. Attól függetlenül még mindig ugyan ezt a kimenetet adja,
Azt tudod, hogy cin-bol milyen ertekeket olvas be?
A szorzást így csináld:

Vektor& operator*(double k, Vektor& op){
  for(int i=0;i<op.nElem;i++)
    op.pVec[i]=op.pVec[i]*k;
  return op;
}

Természetesen a vektor.h -ban is át kell írni!

    /// Szorzás: Valós * Vektor
    friend Vektor& operator*(double, Vektor&);

Természetesen, amit "klorand" mondott szintén igaz! A konstruktorba felesleges a pVec törlése, hiszen akkor még nincs lefoglalva a memória!

Vektor::Vektor(const Vektor& op) {
    //delete[] pVec;
    nElem=op.nElem;
    pVec=new double(nElem);
    for(int k=0;k<nElem;k++) {
        pVec[k]=op.pVec[k];
    }
}

A main.cpp -ben pedig ezt javítsd! A "v0" nem tömb!

eredeti:
        v0 = vt[i];
        for (int j = 0; j < n; j++)
           v0[j] = v0[j] * k++;

új:
        v0 = vt[i];
        for (int j = 0; j < n; j++)
           k++ * v0;

 
Mint ahogy azt már az elején is leírtam ami a Headerben és a Main-ben van ahoz én nem férek hozzá. Tehát nem tudom átírni sem. Tehát azzal ilyen szempontból nem kell foglalkozni hogy jó-e az ami oda le van írva mert nem tudom átírni.
Így ezzel nem vagyunk előrébb sajnos, vhol máshol van a gond
Az én feladatom egész pontosan ez volt:

Önnek az operátorokat, a másoló konstruktort és a destruktort kell megírnia úgy, hogy jól működjön az osztály a mellékelt tesztprogrammal (vektorMain.cpp).
Akkor:
Vektor operator*(double k, Vektor& op) {
    for (int i = 0; i < op.nElem; i++) {
        op.pVec[i] = op.pVec[i] * k;
    }
    return op;
}

És:
Vektor::Vektor(const Vektor& op) {
    //delete[] pVec;
    nElem = op.nElem;
    pVec = new double(nElem);
    for (int k = 0; k < nElem; k++) {
        pVec[k] = op.pVec[k];
    }
}
Haladunk.
a szorzásnál ha beleírom a return-t akkor a program abortál, szóval azt talán hagyjuk.
Észre vettem a hogy a másoló konstruktornál a memó foglalásnál sima zárójelt írtam szögletes helyett. Most már megszűnt a memó szivárgás most már, legalábbis nem írja ki mint hibát. Most már csak simán belemegy az utolsó catch-ba valamiért. Nem tudom miért.
Igaz! A szögletes zárójel. Végzetes hiba!

Akkor próbáld így! (A return mindenképp kell! Hiszen olyan függvénydeklarációt adtak meg, ahol van visszatérési érték. Nem "void" a függvény!)
Vektor operator*(double k, Vektor& op) {
    Vektor result(op.nElem, 1.0);
    for (int i = 0; i < op.nElem; i++) {
        result.pVec[i] = op.pVec[i] * k;
    }
    return result;
}
Ohh köszönöm szépen nagyon hálás vagyok, mert már egy helyben topogok vele egy ideje és nem jutottam egyről a kettőre.
Kösz még 1x
Szívesen.
Pedig már itt is jeleztem, hogy kell a return!
Belépés
E-mail cím:
Jelszó:

RSS források
-Hírek
-Cikkek
-Fórumok
-Állás/munka
Top pontgyűjtők
»Micu1.030
»Interlock280
»mezofi150
»Pitta_100
»Frostech0100
»szbzs.2100
»Riha60
»Akhiles50
»mrchandra50
»Bakter50
Top wikieditorok
»Sting
»Doi
»FlamingClaw
»Argathron
»Csaboka2
»Vodka
»Joexy
»Ivn
»Balucinho
»Kelemzol
» ugrás a wikire
A nap kifejezései
»Algoritmus
»Hogyan kezdjem el
»Perl
» ugrás a wikire
Hírek
»Megérkezett a PostgreSQL 9.0 kiadásra jelölt változata
»Letölthető az új Rad Studio XE és Delphi XE
»Function-X digitális művészeti találkozó és demoscene party
»Webfejlesztőknek szóló közösségi oldalt indított a Microsoft
»Letölthető a hardvergyorsított Chrome 7 első fejlesztői kiadása
» több hír
PC Fórum hírek
»Itt az első kép az AMD nyolcmagos processzoráról
»"Szuperdizájnos" érintő-egeret mutatott be a Microsoft
»Szabadalmaztatta a számítógép kikapcsolását a Microsoft
»Vírusriadót váltott ki a webezőknél a Google
»Ingyen iWiW-ezhetnek mobiljaikról a T-Mobile-osok
»Automatikusan kiválogatja legfontosabb leveleink a Google
»OOo4Kids - ingyenes Office csomag gyerekeknek
»Új, gyorsabb Core i3 és Pentium processzorokat jelentett be az Intel
Tagi blogok
»PSP
»Első Programozó
»USB
»PHP, mint sablonmotor egyszerűen