【问题标题】:Pop "Debug Assertion Failed"弹出“调试断言失败”
【发布时间】:2020-10-04 08:32:43
【问题描述】:

我不知道怎么了,我需要定义一个构造函数还是只保留一个复制构造函数?我认为这是关于浅拷贝和深拷贝的问题。请帮忙,谢谢。 When I was debugging, Pop this window

#include <cstring> 
#include<iostream> 
using namespace std;

class MyString
{
public:
    MyString(const char* s);  //constructor
    ~MyString() {  //destructor
        delete[]data; 
    }
protected:
    unsigned len;
    char* data;
    //char data[20];
};

MyString::MyString(const char* s)
{
    len = strlen(s);
    data = new char[len + 1];
    strcpy_s(data, len, s);
}

int main()
{
    MyString a("C++ Programming");
    MyString b(a);
    return 0;
}

【问题讨论】:

    标签: c++ destructor copy-constructor deep-copy default-copy-constructor


    【解决方案1】:

    正如其他人所提到的,您的代码中没有复制构造函数。

    一个最小的复制构造函数是委托给你现有的const char *构造函数,就像这样(把它放在类MyString的声明中):

    MyString (const MyString &s) : MyString (s.data) {}
    

    如果你想避免令人讨厌的意外,你还应该添加一个复制赋值运算符(规则 3)。

    【讨论】:

    • 当我调试到构造函数时,进入 strcpy_s(data,len,s);它弹出我发布的图片。这里有什么错误?请帮我。对不起,我的英语说得不好,希望你能明白我在说什么。
    • 当我使用 strcpy_s(data,len+1,s) 替换 strcpy_s(data,len,s) 时。它不会弹出那个。
    • 是的,strcpy_s(data,len+1,s) 是正确的(我没有测试过)。加上我的答案或这里的另一个答案。
    【解决方案2】:

    目前,您没有复制构造器。你所拥有的是一个构造函数,它接受一个 const char* 数组。

    复制构造函数的格式如下:

    MyString(const MyString& obj)
    {
       // here you will initialize the char* data array to be of the same size
       // and then copy the data to the new array using a loop or strcpy_s
    }
    

    把它们放在一起,你可以写出这样的东西:

    #include <cstring> 
    #include<iostream> 
    using namespace std;
    
    class MyString
    {
    public:
        MyString(const char* s);  //constructor
        MyString(const MyString& obj);  //constructor
    
        ~MyString() {  //destructor
            delete[] data; 
        }
    
    protected:
        unsigned int len;
        char* data;
    
        void copy_cstring(const char* s)
        {
            len = strlen(s);
            data = new char[len + 1]; // len + 1 to make room for null terminate \0
    
            int i = 0;
            for (i = 0; i < len; ++i)
            {
                data[i] = s[i];
            }
            data[i] = '\0'; // add \0 to the back of the string
        }
    };
    
    MyString::MyString(const char* s)
    {
        copy_cstring(s);
    }
    
    MyString::MyString(const MyString& obj)
    {
        copy_cstring(obj.data);
    }
    
    int main()
    {
        MyString a("C++ Programming");
        MyString b(a);
        return 0;
    }
    
    

    当我使用 strcpy_s(data,len+1,s) 替换 strcpy_s(data,len,s) 时。它 不会弹出那个。 – 前卫

    发生这种情况是因为当您使用 strcpy_s 时,它也会复制空终止字符,如果您的目标 cstring 不够大,它将引发异常,但是一旦您将 1 添加到 len 您的目标 cstring 就是将有足够的大小。

    【讨论】:

    • 非常感谢。这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多