首页 > 解决方案 > 弹出“调试断言失败”

问题描述

我不知道出了什么问题,我需要定义一个构造函数还是只保留一个复制构造函数?我认为这是关于浅拷贝和深拷贝的问题。请帮忙,谢谢。 调试的时候弹出这个窗口

#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++destructorcopy-constructordeep-copydefault-copy-constructor

解决方案


目前,您没有复制构造函数。你所拥有的是一个构造函数,它接受一个 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) 时。它不会弹出那个。– theprog

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


推荐阅读