在c++地图访问上的segfault
Seg fault on C++ map access
我在编写的一些代码中遇到了一个奇怪的问题。基本上,每当我试图从空映射中获取一些信息时,程序就会出现分段故障。以下是相关代码:(注意struct Pair是前面定义的数据结构,sendmask是std::map,这很好)
std::map<std::string*, struct Pair*>::iterator it;
for(it = sendMasks->begin(); it != sendMasks->end(); it++){ //segfault
//(some code goes here)
}
我知道指向映射的指针是好的;我可以做
it = sendMasks->begin();
it = sendMasks->end();
在我的循环之前,它根本不会出现段错误。
现在,如果我把下面的测试放在for循环之前,它将出现分段错误:
if( sendMasks->empty() )
其他试图确定映射是否为空的尝试也将如此。
此问题只会在地图为空时发生。我对这个问题的唯一想法是,因为我在一个单独的线程中更新sendmask,它可能没有被正确更新;然而,这没有任何意义,因为这只会发生在地图为空的情况下,而这段代码在此之前工作得很好。还有其他想法吗?
编辑:我知道问题出在哪里了。
在前面的代码中,我创建了一个新的char*数组,并将指针放入另一个长度为4的数组中。然后我在我的新数组的末尾放了一个NULL字符,但意外地只做了第一个数组的下标-它离开了数组的末尾并覆盖了一个指针。不知何故,这偶尔能正常工作。(valgrind没有检测到这个问题)
序列是这样的:
object* = NULL; //(overwritten memory)
object->method();
//Inside object::method() :
map->size(); //segfault. Gets an offset of 0x24 into the object,
//which is NULL to begin with. memory location 0x24 = invalid
我没想到对象本身的实例是空的,因为在Java中,这个方法调用会在它这样做之前失败,而在C中,这将是完全不同的(我在c++中不做太多面向对象的编程)
如果从不同的线程访问数据结构,则必须进行某种同步。你应该确保你的对象不会被不同的线程同时访问。同样,您应该确保其中一个线程所做的更改对其他线程完全可见。
互斥锁(或者临界区,如果在Windows上)应该做到这一点:结构应该在每次访问时锁定。这确保了对数据结构的独占访问,并为您创建了所需的内存屏障。
欢迎来到多线程世界!
-
你在某个地方犯了一个错误,已经损坏了你的记忆。通过valgrind运行应用程序来查找。
-
您没有使用锁来访问线程之间共享的对象。
我知道指向映射的指针是好的;我可以做
it = sendMasks->begin(); it = sendMasks->end();
在我的循环之前,它根本不会出现段错误。
这个逻辑有缺陷。
分段错误不是某种一致的、可靠的错误指示。它们只是完全不可预测的系统的一个可能的症状,当您调用未定义行为时就会出现。
这段代码之前运行得很好
同样适用于这里。它可能已经静默地"工作"了年,静默地覆盖内存中它可能或可能无法安全访问的字节。
此问题只会在map为空时发生。
你只是很幸运,当地图是空的,你的错误是明显的。纯粹的机会。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 而失败,但在 X86_64 中工作
- 当一个对象试图访问它的某个属性时,程序是否可能发送Segfault
- 访问std :: list instruct struct诱导segfault
- ctypes/C++segfault访问成员变量
- RapidXML访问同级节点似乎毫无原因地导致segfault
- 访问迭代器值会导致segfault 11
- 访问已销毁的对象不会导致segfault
- 尝试访问QGraphicsTextItem的成员时出现segfault
- 使用共享指针访问单例子类时的SEGFAULT
- C++-映射迭代器访问导致segfault
- 从插槽访问中央小部件时出现Segfault
- 尝试访问向量中对象中的字段时出现Segfault
- 访问成员stl映射时的C++Segfault
- 访问私有成员导致segfault
- 试图访问对象成员时出现segfault
- 在c++地图访问上的segfault