【问题标题】:Why is my setter method producing a bad access error为什么我的 setter 方法会产生错误的访问错误
【发布时间】:2018-10-01 06:59:20
【问题描述】:

错误访问意味着我正在尝试访问不存在的内存我已经尝试并尝试为此类分配内存,但到处都失败了。我不知道错误实际来自哪里。它只告诉我我的 setter 方法是程序崩溃的时候。在 setFName() 方法中是发生错误的地方。但在主要方法中它实际发生的地方。 护士.hpp

#ifndef Nurse_hpp
#define Nurse_hpp

#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;

class nurse{
private:
    string firstName;
public:
    nurse() {
        firstName = "jim";
    }
    string getFName() {return firstName;}
    void setFName(string fName) {firstName = fName;} // Thread 1: bad access 0x0
};

#endif /* Nurse_hpp */

这里是实际发生错误的地方 main.cpp

#include <cstdint>  // ::std::uint64_t type
#include <cstddef> // ::std::size_t type
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include "nurseHolder.hpp"
using namespace std;

nurseHolder *l = new nurseHolder();

int main() {


 return 0;
}

最后是导致问题的类 护士持有人.hpp

#ifndef Nurses_hpp
#define Nurses_hpp

#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include "Nurse.cpp"
using namespace std;

class nurseHolder{
private:
    int nurse_cnt;
    int nurse_cap;
    vector<nurse> nurse_list;
public:


    nurseHolder()  {
    nurse_cnt = 0;
    nurse_cap = 10;
    for(int i= 0; i < 11; i++){
        nurse_list[i].setFName("na");
      }
    }
    vector<nurse> &getNurseList() { return nurse_list;}

};

#endif /* Nurses_hpp */

如果代码太多,我尽量使这个紧凑。

这是我为使代码正常工作所做的更改:

nurseHolder()  {
        nurse_cnt = 0;
        nurse_cap = 10;
        for(int i= 0; i < 11; i++){
            nurse l;
            nurse_list.pushback(l);
          }
        }

这是正确的做法吗?

【问题讨论】:

  • 您的向量 nurse_list 的大小为 0。
  • 如何添加尺寸? @tkausl
  • 您使用其push_back 方法添加到向量中。当您使用数组访问语法时,例如在nurse_list[i] 中,您正在访问一个据说已经存在的元素。
  • @DevinTripp 使用适当的constructorresizepush_back
  • vector.push_back(element) 向vector添加元素,目前为空

标签: c++ memory memory-leaks


【解决方案1】:

您的向量nurse_list 的大小为0。因此您不能使用[] 运算符来设置名称。 有两种方法可以纠正这个问题:

  1. 设置向量的初始大小并使用[] 设置名称。
  2. 使用push_back 将元素添加到向量中。

第一种方法。

nurse_list.resize(noOfTotalNurses). 
nurse_list[i].setFName("name");

第二种方法。

nurse tNurse; //local nurse object
tNurse.setFName("name");
nurse_list.push_back(tNurse);

【讨论】:

  • 我做到了。告诉我是否可以。
  • 您必须使用setFNamenurse l 对象设置名称。
猜你喜欢
  • 1970-01-01
  • 2019-08-06
  • 2015-05-10
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2022-01-12
  • 2018-03-17
相关资源
最近更新 更多