C++ memcpy/strcpy 的 char 指针指向 class 成员 char 指针
C++ memcpy/strcpy of char pointer to class member char pointer
我有一个自定义 class,我们称它为“Student”和一个主要方法。我正在实例化 class,只想输出 class.
的内容
我的程序崩溃了:Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
实际代码
Student.h
#ifndef PROG2_STUDENT_H
#define PROG2_STUDENT_H
#include <iostream>
class Student
{
private:
char *name;
char *firstName;
unsigned matriculationNumber;
unsigned semester;
public:
Student(char *name, char *firstName, unsigned matriculationNumber, unsigned semester);
~Student();
friend std::ostream &operator<<(std::ostream &ostream, const Student &student);
private:
};
#endif
Student.cpp
#include <cstring>
#include "Student.h"
Student::Student(char *name, char *firstName, unsigned matriculationNumber, unsigned semester)
{
std::strcpy(this->name, name);
std::strcpy(this->firstName, firstName);
this->matriculationNumber = matriculationNumber;
this->semester = semester;
}
Student::~Student()
{
delete[] this->name;
delete[] this->firstName;
}
std::ostream &operator<<(std::ostream &stream, const Student &input)
{
stream << input.name << ", " << input.firstName << ": "
<< input.semester << " Semester, MA " << input.matriculationNumber;
return stream;
}
和我的主要
#include <iostream>
#include "StudentPackage/Collection/StudentCollection.h"
int main()
{
Student studentOne((char *)"Testerson", (char *)"Test", 12345, 2);
std::cout << studentOne << std::endl;
return 0;
}
我试过的
我尝试了几种方法,包括 memcpy。但是使用 memcpy 我无法正确检测到 char 数组的大小。
当我将 Student Constructor 更改为以下内容时,析构函数中的 delete/free 出现问题。我想,无论如何这都不是正确的方法,但这种情况正在发生,因为输入变量的范围在调用 class 析构函数之前被销毁,对吗?
Student::Student(char *name, char *firstName, unsigned matriculationNumber, unsigned semester)
{
this->name = name;
this->firstName = firstName;
this->matriculationNumber = matriculationNumber;
this->semester = semester;
}
问题
- 如何从构造函数(名称到 this->名称)正确复制字符数组?
- 如何从构造函数(firstName 到 this->firstName)正确复制 char 数组?
std::strcpy
不分配内存。因此,您的程序正在将输入复制到放置 Student
对象的内存区域中出现的“垃圾”地址。因此,您遇到段冲突也就不足为奇了。有两种解决方案:
- 一种“C 风格”方式 - 手动分配内存(即像
auto n = std::strlen(name); this->name = new char[n + 1]; std::strcpy(this->name, name);
),但随后您需要在析构函数中手动删除它(即 delete name;
)。顺便说一句,n + 1
因为您还需要空终止符的空间,strlen
结果不包括它。
- 更好更“C++”的方式——使用
std::string
(即将name
成员变量声明为std::string
)。然后你可以做一个赋值:this->name = name;
,不需要手动内存管理 - std::string
会照顾。
- (代码风格)还建议为成员变量使用一些前缀或后缀,即像
m_name
(更多“Microsoft”风格),或 name_
- 更多“Google " 样式,避免那些不必要的 this->
.
我有一个自定义 class,我们称它为“Student”和一个主要方法。我正在实例化 class,只想输出 class.
的内容我的程序崩溃了:Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
实际代码
Student.h
#ifndef PROG2_STUDENT_H
#define PROG2_STUDENT_H
#include <iostream>
class Student
{
private:
char *name;
char *firstName;
unsigned matriculationNumber;
unsigned semester;
public:
Student(char *name, char *firstName, unsigned matriculationNumber, unsigned semester);
~Student();
friend std::ostream &operator<<(std::ostream &ostream, const Student &student);
private:
};
#endif
Student.cpp
#include <cstring>
#include "Student.h"
Student::Student(char *name, char *firstName, unsigned matriculationNumber, unsigned semester)
{
std::strcpy(this->name, name);
std::strcpy(this->firstName, firstName);
this->matriculationNumber = matriculationNumber;
this->semester = semester;
}
Student::~Student()
{
delete[] this->name;
delete[] this->firstName;
}
std::ostream &operator<<(std::ostream &stream, const Student &input)
{
stream << input.name << ", " << input.firstName << ": "
<< input.semester << " Semester, MA " << input.matriculationNumber;
return stream;
}
和我的主要
#include <iostream>
#include "StudentPackage/Collection/StudentCollection.h"
int main()
{
Student studentOne((char *)"Testerson", (char *)"Test", 12345, 2);
std::cout << studentOne << std::endl;
return 0;
}
我试过的
我尝试了几种方法,包括 memcpy。但是使用 memcpy 我无法正确检测到 char 数组的大小。
当我将 Student Constructor 更改为以下内容时,析构函数中的 delete/free 出现问题。我想,无论如何这都不是正确的方法,但这种情况正在发生,因为输入变量的范围在调用 class 析构函数之前被销毁,对吗?
Student::Student(char *name, char *firstName, unsigned matriculationNumber, unsigned semester)
{
this->name = name;
this->firstName = firstName;
this->matriculationNumber = matriculationNumber;
this->semester = semester;
}
问题
- 如何从构造函数(名称到 this->名称)正确复制字符数组?
- 如何从构造函数(firstName 到 this->firstName)正确复制 char 数组?
std::strcpy
不分配内存。因此,您的程序正在将输入复制到放置 Student
对象的内存区域中出现的“垃圾”地址。因此,您遇到段冲突也就不足为奇了。有两种解决方案:
- 一种“C 风格”方式 - 手动分配内存(即像
auto n = std::strlen(name); this->name = new char[n + 1]; std::strcpy(this->name, name);
),但随后您需要在析构函数中手动删除它(即delete name;
)。顺便说一句,n + 1
因为您还需要空终止符的空间,strlen
结果不包括它。 - 更好更“C++”的方式——使用
std::string
(即将name
成员变量声明为std::string
)。然后你可以做一个赋值:this->name = name;
,不需要手动内存管理 -std::string
会照顾。 - (代码风格)还建议为成员变量使用一些前缀或后缀,即像
m_name
(更多“Microsoft”风格),或name_
- 更多“Google " 样式,避免那些不必要的this->
.