c++ - 弹出“调试断言失败”
问题描述
我不知道出了什么问题,我需要定义一个构造函数还是只保留一个复制构造函数?我认为这是关于浅拷贝和深拷贝的问题。请帮忙,谢谢。 调试的时候弹出这个窗口
#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;
}
解决方案
目前,您没有复制构造函数。你所拥有的是一个构造函数,它接受一个 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 就会有足够的大小.
推荐阅读
- python - 按键错误,时间数据与格式不匹配
- sql - PostgreSQL:插入并获取新 ID 以在 LO-BASE 中使用
- swift - Swift iOS/Mac Catalyst:点击显示所有笔记或结束时间时,EKEventViewController 和 EKEventEditViewController 什么都不做
- javascript - 在 Google App Maker 中,如何让 Multi Select Widget 默认选择所有选项?
- ruby-on-rails - 如何使用范围和存在为 validates_uniqueness_of 编写测试:真正的 RSpec Rails
- image-processing - 将任何 PyTorch cuda 张量带入 [0,1] 范围内
- codeigniter - Codeigniter 上的 Hybridauth 无法加载 Hybrid_Auth 类
- c# - serilog 未将日志写入本地应用程序数据文件夹
- batch-file - 用单双读取批量参数 -
- java - 使用 JDBC 声明式事务时事务没有回滚