会员.h
pragma once
#ifndef MEMBER_H
#define MEMBER_H
#include <iostream>
#include <string>
using namespace std;
class Member {
private:
char* m_id;
char* m_pwd;
char* m_name;
int m_age;
public:
Member();
Member(const char* id, const char* pwd, const char* name, int age);
char* getID();
char* getPWD();
char* getName();
int getAge();
void setID(char* id);
void setPWD(char* pwd);
void setName(char* name);
void setAge(int age);
void printMeminfo();
~Member();
};
#endif
成员.cpp
#include "Member.h"
Member::Member() {
char* m_id = new char;
char* m_pwd = new char;
char* m_name = new char;
int m_age = 0;
};
Member::Member(const char* id, const char* pwd, const char* name, int age) {
int len = strlen(id);
char* m_id = new char[len + 1];
strcpy_s(m_id, len + 1, id);
len = strlen(pwd);
char* m_pwd = new char[len + 1];
strcpy_s(m_pwd, len + 1, pwd);
len = strlen(name);
char* m_name = new char[len + 1];
strcpy_s(m_name, len + 1, name);
int m_age = age;
};
char* Member::getID() { return m_id; }
char* Member::getPWD() { return m_pwd; }
char* Member::getName() { return m_name; }
int Member::getAge() { return m_age; }
void Member::setID(char* id) {
m_id = id;
}
void Member::setPWD(char* pwd) {
m_pwd = pwd;
}
void Member::setName(char* name) {
m_name = name;
}
void Member::setAge(int age) { m_age = age; }
void Member::printMeminfo() {
cout << m_id << ' ' << m_name << ' ' << m_age << endl;
}
Member::~Member() {
delete[] m_id;
delete[] m_pwd;
delete[] m_name;
}
主.cpp
#include "Member.h"
#include <iostream>
#include <string>
using namespace std;
int main() {
Member* mem = new Member[4] {
Member(), Member(), Member(), Member()
};
char infos[4][3][11]{
{"cheol88", "cheol88", "김철수"}, {"ywjeong123", "12345^", "정연우"},
{"Jiwoon456", "34563%", "박지운"}, {"Choi931", "96454$$", "최지우"}
};
int ages[4] = { 23, 31, 35, 26 };
for (int a = 0; a < 4; a++) {
mem[a].setID(infos[a][0]);
mem[a].setPWD(infos[a][1]);
mem[a].setName(infos[a][2]);
mem[a].setAge(ages[a]);
}
char* ID = new char;
char* PW = new char;
while (1) {
cout << "ID looking for : ";
cin >> ID;
cout << "Password of the ID : ";
cin >> PW;
int found = 0;
if ((strcmp(ID, "0000")==0) && (strcmp(PW, "0000")==0)) {
break;
}
for (int i = 0; i < 4; i++) {
if ((strcmp(ID, mem[i].getID())==0) && (strcmp(PW, mem[i].getPWD())==0)) {
mem[0].printMeminfo();
found = 1;
}
}
if (found == 0) {
cout << "Not found" << endl;
}
}
delete[] mem;
delete ID;
delete PW;
return 0;
}
我得到的错误: HEAP[Project3.exe]:指定给 RtlValidateHeap 的地址无效(000001CB11980000、00000065390FF843) 在 Project3.exe 中执行了断点指令(__debugbreak() 语句或类似的调用)。
请赐教我真的不知道
进行了一项研究,我猜问题与“删除”有关。 但仅此而已..
您注意到的错误可能确实是由于
delete
语句造成的。在您的 main()
函数中,您将具有自动存储持续时间(它位于堆栈中)的 char[]
的地址分配给作为 Member
成员的指针。在析构函数 Member::~Member()
中,您在此指针上调用 delete[]
。在不是通过 delete
获取的指针上调用 new
是 C++ 标准的未定义行为 (UB)。您对 m_id
、m_pwd
和 m_name
也有同样的问题。
mem[a].setID(infos[a][0]);
void Member::setID(char* id) {
m_id = id;
}
Member::~Member() {
delete[] m_id;
delete[] m_pwd;
delete[] m_name;
}
为了避免使用指针时出现的所有麻烦,您应该使用
std::string
来处理所有必要的内存管理,而不是普通的 C 风格 char*
。