试图从指针向量中取消引用指针的分段错误
Segmentation fault trying to dereference a pointer from a vector of pointers
我有一个指向对象的指针向量,我正在使用std::vector::迭代器对其进行迭代`。由于返回的元素本身就是一个指针,我两次取消引用迭代器,一次返回指针,一次解析指向实际对象的指针。
我正在尝试调用一个返回std::字符串的成员函数(getClass
(,我已经尝试了(**it).getClass()
和(*it)->getClass()
,但都出现了分段错误。我一直觉得我错过了一些显而易见的东西。
部分功能代码:
void dataSet::createFolds()
{
// Shuffle the data vector
std::random_shuffle( m_records.begin(), m_records.end());
std::cout << "STARTING MAIN LOOP. THERE ARE " << m_records.size() << " RECORDSn";
// iterate through the data vector and assign each to a fold
std::vector<dataRecord *>::iterator it = m_records.begin();
while (it != m_records.end())
{
std::string currentClass = (*it)->getClass(); // SEG FAULT HERE
.
.
.
}
.
.
.
}
向量是m_records。。。代码
dataRecord是这样定义的。。。代码
回答有关填充矢量的问题:
数据是从文本文件中读取的,除非迫不得已,否则我真的不想发布整个内容(212行(,但下面是填充矢量的相关代码。dataRecord对象的构造函数采用字段对象的向量。我使用一个临时指针,使用new创建对象,然后将指针推回。
while ...
{
std::vector<field> fields;
// build the fields vector
for (unsigned int i = 0; i < numAttribs; ++i)
fields.push_back(field(data.at(i), attribTypes[i]));
// create the new dataRecord
dataRecord * newRecord = new dataRecord(fields);
// add the record to the set
m_records.push_back(newRecord);
++recordNum;
std::cout << "read record " << recordNum << std::endl;
}
在我看来,向量元素初始化得很糟糕。也许在测试提取向量之前,您必须独立测试填充向量的代码。对不起我的英语;(
容器中的指针要么为空,要么是指向空闲内存的悬挂指针。
仔细检查填充m_records
的代码。
在中
std::string dataRecord::getClass() {return m_data.at(m_data.size() - 1).getTextData();}
您必须验证m_data.size((,因为它可能是0,所以您将得到一个超出或范围的异常。
// create the new dataRecord
dataRecord * newRecord = new dataRecord(fields);
我猜这个错误在dataRecord
的构造函数中。你确定它做得很好吗?
这不一定适用于OP的问题,但适用于那些从谷歌搜索到这里的人。。。
如果您在解引用向量迭代器上收到segfault,并且在多线程应用程序中工作,请记住,向量不是线程安全的必要条件!
以下示例在没有互斥锁的情况下是不安全的。
线程1
myVector.push_back(new Object());
线程2
std::vector<Object*>::iterator = myVector.begin();
for (it; it != myVector.end(); it++) {
Object* obj = *it;
}
相反,应该这样做:
myMutex.lock();
myVector.push_back(new Object());
myMutex.unlock();
线程2
myMutex.lock();
std::vector<Object*>::iterator = myVector.begin();
for (it; it != myVector.end(); it++) {
Object* obj = *it;
}
myMutex.unlock();
相关文章:
- 如何使用基类指针引用派生类成员
- 将常量指针引用绑定到非常量指针
- 如果非动态变量被指针引用,何时超出范围?
- 转换指针引用的字符串
- 指针引用的生存期(以 C++为单位)
- 从 unique_ptr::get 发送指针作为指针引用进入函数
- 指针/引用的 CLion 格式
- 使用模板专用化来比较指针引用
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++初始化指针/引用/复制细微差别
- 用数组或指针引用函数?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 强制转换为指针引用是否会导致未定义的行为
- 访问由 void 指针引用的结构的成员
- C 为什么当先前的步骤引发异常时,std :: shared_ptr的指针引用会被破坏
- 动态指针引用数组由三元运算符返回值,但有异常
- 悬空指向 int 和 char* 常量的指针/引用
- C++ 二维数组和指针引用
- 通过使用指针/引用,在C++中使用向量加快计算速度
- C++非类型模板模板到函数指针/引用