-5

I'm having problems with these three parts of codes, in the terms of Memory Allocations. I haven't got it yet.

Could you please point out to me what I am doing wrong and how I should go on correcting it?

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: Defined as above

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

3: Still defined as above

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;
};
4

2 回答 2

4

首先,只需使用std::string. 其次,违反三规则。第三,你delete是 1's 中的一个局部变量main,这是错误的。

于 2013-05-25T10:27:32.083 回答
2
  1. C++ 有一个内置的字符串类,std::string你为什么不使用它呢?

  2. 你的赋值语义被破坏了。您需要一个赋值运算符和一个复制构造函数来复制str.

    在 C++ 中,必须有一致的复制构造函数、赋值和析构函数。这就是DeadMG中提到的三个规则。您应该阅读相关问题什么是三法则?

    复制时MyString,您的代码会进行浅拷贝。所以两个实例共享相同的数据。一旦你销毁第一个实例,第二个实例就有一个悬空指针。

  3. 您的代码示例 1 分配一个指向局部变量的指针strp,然后尝试删除它。您只能释放使用new MyString(...)with分配的内存delete

    局部变量的析构函数一旦超出范围就会自动销毁。您不需要(也不能)使用free.

  4. 如果您的类实现正确,代码示例 2 会很好。它使用复制构造函数将堆分配的字符串复制到局部变量。但是由于您的复制构造器实际上并未复制内存,因此它也已损坏。

于 2013-05-25T10:34:45.253 回答