мусор в массиве после конструктора копирования
После операции копирования в массиве-копии находится мусор. Изначально я думал что массив-копия больше копируемого, в связи с этим там и образовываются мусорные данные из памяти, но после попытки фикса все так и остается. Может это и вовсе не конструктор копирования, а бред полнейший, такой исход тоже не исключен, в связи с тем что я новичок. Заголовок:
#ifndef MAIN_H
#define MAIN_H
#include <string>
#include <iostream>
using namespace std;
class MyString {
private:
char* str;
int length;
public:
MyString();//default constructor
MyString(const char* str);//string constructor
MyString(const MyString& other);//copy constructor
~MyString();//destructor
void show();
};
MyString::MyString() {
str = nullptr;
adress = nullptr;
}
MyString::MyString(const char* str) {
int length = strlen(str);
this->length = length;
this->str = new char[length + 1];
for (int i = 0; i < length; i++) {
this->str[i] = str[i];
}
this->str[length + 1] = '\0';
}
MyString::MyString(const MyString& other) {
this->length = other.length;
this->str = new char[other.length];
for (int i = 0; i < length; i++) {
this->str[i] = other.str[i];
if (i = length) {
str[i] = '\0';
}
}
//other.str[length] = '\0';
}
MyString::~MyString() {
delete this->str;
}
void MyString::show() {
cout << str << endl;;
}
#endif //MAIN
Сам main.cpp:
#include "main.h"
int main()
{
MyString str("Sss");
str.show();
MyString str2(str);
str2.show();
}
Ответы (1 шт):
Начнем потихоньку...
Что за
adress = nullptr;
Никакого adress у вас нет! А вот тут же занулить бы на всякий пожарный и длину не мешало бы. Или вообще использовать
MyString::MyString(const char* str = "") {
как конструктор по умолчанию.
this->str = new char[length + 1];
...
this->str[length + 1] = '\0';
Имеем выход за границы массива.
В копирующем вы выделяете недостаточно памяти:
this->str = new char[other.length];
и потом,
if (i = length) {
Может, == ? И вообще, какой смысл в этом нолике? просто копируйте length+1 символ и все... Только памяти выделите достаточное количество!
Но этот мусорный символ у вас - из-за this->str[length + 1] = '\0';
P.S. Не забудьте корректно написать оператор присваивания!