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

问题

  1. 如何从构造函数(名称到 this->名称)正确复制字符数组?
  2. 如何从构造函数(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->.