2016-11-23 13 views
-3

コンストラクタを呼び出そうとしたときにランタイムエラーが発生しました。メモリの削除を正しく行っていないと思います。ここ変数 ''の周りのスタックがC++で壊れていた

const int id_ferma; 
int suprafata; 
int nr_produse; 
char* produse[]; 

Ferma(int id_ferma, int suprafata, int nr_produse, char* produse[]) :id_ferma(id_ferma){ 
     this->suprafata = suprafata; 
     this->nr_produse = nr_produse; 
     for (int i = 0; i < nr_produse; i++){ 
      this->produse[i] = new char[strlen(produse[i]) + 1]; 
      strcpy(this->produse[i], produse[i]); 
      cout << produse[i] << endl; 
     } 
    } 

そして、私のデストラクタです:

~Ferma(){ 
    for (int i = 0; i < nr_produse; i++){ 
      if (this->produse[i] != NULL) 
       delete produse[i]; 
    } 
} 

メイン:

int main(){ 
     char* produse1[] = { "Lapte oaie", "Branza vaca", "Muschi de porc", "Oua de gaina" }; 
     for (int i = 0; i < 4; i++){ 
      cout << produse1[i]; 
     } 
     Ferma f1(14, 1500, 4, produse1); 
    } 
+10

は一度、すべての手動メモリ管理を停止します。 – SergeyA

答えて

0

あなたはproduseフィールドを初期化していないが、ここに私のconstrucorです。

C++を慣用的に使用する場合は、生の配列の代わりにvectorを使用し、char*の代わりにstringを使用する必要があります。

+1

教えてください、どうすればいいですか?私はnoobをC++にしています –

0

あなたはnew[]でメモリを割り当てているので、あなたはdelete[]でそれを解放する必要があります。

int *p = new int[10]; 
... 
delete[] p; 

int* p[1] = {new int[10]}; 
... 
delete[] p[0]; 

そしてprodusechar **ているので、あなたはそれを参照解除しようとする前にproduseのためのメモリを割り当てる必要があります。

char **produse = new char *[10]; 
produse[0] = new char [10]; 
... 
delete[] produse[0]; 
delete[] produse; 
1

メモリを割り当てようとする前にthis->produseにメモリを割り当てていません。また、動的に割り当てられたメモリを手動で管理しているため、Rule of Threeも手動で実装する必要があります。

は、代わりにこれを試してみてください:

#include <algorithm> 

class Ferma 
{ 
private: 
    int m_id_ferma; 
    int m_suprafata 
    int m_nr_produse; 
    char** m_produse; // <-- change this to char**! 

public: 
    Ferma(int id_ferma, int suprafata, int nr_produse, char* produse[]) 
     : m_id_ferma(id_ferma), m_suprafata(suprafata), m_nr_produse(nr_produse) 
    { 
     m_produse = new char*[nr_produse]; // <-- add this! 

     for (int i = 0; i < nr_produse; ++i) 
     { 
      m_produse[i] = new char[strlen(produse[i]) + 1]; 
      strcpy(m_produse[i], produse[i]); 
     } 
    } 

    Ferma(const Ferma &src) // <-- add this! 
     : m_id_ferma(src.m_id_ferma), m_suprafata(src.m_suprafata), m_nr_produse(src.m_nr_produse) 
    { 
     m_produse = new char*[m_nr_produse]; 

     for (int i = 0; i < m_nr_produse; ++i) 
     { 
      m_produse[i] = new char[strlen(src.m_produse[i]) + 1]; 
      strcpy(m_produse[i], src.m_produse[i]); 
     } 
    } 

    ~Ferma() 
    { 
     for (int i = 0; i < m_nr_produse; ++i) 
      delete[] m_produse[i]; // <-- change this to delete[]! 

     delete[] m_produse; // <-- add this! 
    } 

    Ferma& operator=(const Ferma &rhs) // <-- add this! 
    { 
     Ferma tmp(rhs); 
     std::swap(m_id_ferma, tmp.m_id_ferma); 
     std::swap(m_suprafata, tmp.m_suprafata); 
     std::swap(m_nr_produse, tmp.m_nr_produse); 
     std::swap(m_produse, tmp.m_produse); 
     return *this; 
    } 
}; 

言われて、あなたが手動メモリー管理の使用を停止する必要があること。代わりにstd::vectorstd::stringを使用し、STLはあなたのためのメモリ管理のすべてを処理してみましょう:

#include <vector> 
#include <string> 

class Ferma 
{ 
private: 
    int m_id_ferma; 
    int m_suprafata; 
    std::vector<std::string> m_produse; 

public: 
    Ferma(int id_ferma, int suprafata, int nr_produse, char* produse[]) 
     : id_ferma(id_ferma), m_suprafata(suprafata) 
    { 
     m_produse.reserve(nr_produse); 

     for (int i = 0; i < nr_produse; ++i) 
      m_produse.push_back(produse[i]); 

     // alternatively: 
     // std::copy(produse, produse+nr_produse, std::back_inserter(m_produse)); 
    } 

    // no destructor, copy constructor, or copy assignment operator needed! 
}; 
関連する問題