“执行了断点指令(__debugbreak() 语句或类似的调用)”,没有断点:(

问题描述 投票:0回答:1

会员.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() 语句或类似的调用)。

请赐教我真的不知道

进行了一项研究,我猜问题与“删除”有关。 但仅此而已..

c++ visual-c++ heap delete-operator debugbreak
1个回答
0
投票

您注意到的错误可能确实是由于

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*

© www.soinside.com 2019 - 2024. All rights reserved.