2013-05-25 3 views
-5

У меня возникают проблемы с этими тремя частями кодов в терминах выделения памяти. У меня еще нет.Проблемы с распределением памяти, строка и т. Д.

Не могли бы вы указать мне, что я делаю неправильно и как я должен исправлять его?

1:

class MyString { 
public: 
    MyString() : str(0) {} 
    MyString(char *a) 
    { str = new char[strlen(a)+1]; strcpy(str,a); } 
    ~MyString() { delete[] str; } 
private: 
    char *str; 
    friend ostream& operator<<(ostream &os, const MyString &str); 
}; 

ostream& operator<<(ostream &os, const MyString &s) 
{ 
    return os << s.str << endl; 
} 

int main() 
{ 
    MyString str("Mitt namn"); 
    MyString *strp = &str; 
    // alot of code 
    delete strp; 
    // alot of code 
} 

2: как определено выше

int main() 
{ 
    MyString *str1 = new MyString("Mitt namn"); 
    MyString str2 = *str1; 
    delete str1; 
    // alot of code 
    cout << str2 << endl; 
} 

3: Тем не менее, как определено выше

class MyASCII : public MyString { 
public: 
    MyASCII(char *a) : MyString(a), ascii(0) 
    { 
     if (a==0) return; 
     ascii = new int[strlen(a)]; 
     for (int i=0; i<strlen(a); i++) 
      ascii[i] = int(a[i]); 
    } 
    ~MyASCII() { delete[] ascii; } 
private: 
    int *ascii; 
}; 
+1

Ну, в чем проблема? –

ответ

4

Во-первых, просто использовать std::string. Во-вторых, нарушение правила трех. В-третьих, вы используете delete локальную переменную в 1 main, что неверно.

+0

Вы можете уточнить, где проблемы? – Stabbah

+0

@Stabbah Удалите весь этот код и вместо этого используйте 'std :: string'. –

+0

@CaptainObvlious Хорошо, я понял. Но во втором, что я там делаю неправильно? – Stabbah

2
  1. C++ имеет встроенный класс строк, std::string, почему бы вам не использовать его?
  2. Ваша семантика вашего назначения нарушена. Вам нужен оператор присваивания и конструктор копирования, который копирует память, хранящуюся str.

    В C++ необходимо иметь последовательный конструктор-копир, назначение и деструктор. Это ссылка на Rule of three DeadMG. Вы должны прочитать соответствующий вопрос What is The Rule of Three?

    При копировании MyString ваш код делает мелкую копию. Таким образом, оба экземпляра используют одни и те же данные. Как только вы уничтожаете первый экземпляр, второй имеет свисающий указатель.

  3. Ваш образец кода 1 присваивает указатель локальной переменной strp, а затем пытается удалить его. Вы можете освободить только память, которая была выделена new MyString(...) с delete.

    Деструктор локальных переменных автоматически уничтожается после того, как они выходят из сферы действия. Вам не нужно (и не может) освобождать их вручную с помощью free.

  4. Пример кода 2 был бы прекрасен, если бы ваш класс был выполнен правильно. Он использует конструктор копирования, чтобы скопировать выделенную кучу строку в локальную переменную. Но поскольку ваш копировальный конструктор фактически не копирует память, он тоже сломан.

+0

Большое спасибо. Готово. Закрытый корпус. – Stabbah

Смежные вопросы