我有一个项目,我正在与std地图有一些奇怪的行为.
我定义了自己的typedef映射,它将字符串映射到自定义类型的指针.在我将第一对添加到地图后,应用程序在我超出地图的任何时候崩溃了.
在经历了很多混乱之后,我将地图更改为a并将其移动到我的应用程序中的第一个调用,它仍然崩溃.我不知道会发生什么.任何帮助,将不胜感激.
这是目前崩溃的代码.
LoggerPtr syslogger(Logger::getLogger("CISInterface"));
int main(int argc, char *argv[])
{
typedef std::map<string, string> MyMapDef;
MyMapDef tmpString;
tmpString.insert(MyMapDef::value_type("0000", "d"));
tmpString.insert(MyMapDef::value_type("1111", "d")); //Crashes here.
tmpString.insert(MyMapDef::value_type("2222", "d"));
// std::string configFile;
// int c;
// if(argc < 2)
// {
// //Must have c option
// std::cout << "Usage -c configFileName" << std::endl;
// exit(EXIT_FAILURE);
// }
//Rest of main commented out.
...
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪 -
CISInterface Debug [C/C++ Application]
gdb/mi (10/31/12 6:02 PM) (Suspended)
Thread [1] (Suspended: Signal 'SIGSEGV' received. Description: Segmentation fault.)
6 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const() 0x00000032fd49c416
5 std::operator< <char, std::char_traits<char>, std::allocator<char> >() basic_string.h:2317 0x0000000000417ec7
4 std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator() stl_function.h:230 0x000000000041706f
3 std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_insert_unique() stl_tree.h:1170 0x0000000000415d00
2 std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::insert() stl_map.h:500 0x00000000004150eb
1 main() CISInterface.cpp:29 0x000000000041916d
gdb (10/31/12 6:02 PM)
/home/cillian/workspace/CISInterface/Debug/CISInterface (10/31/12 6:02 PM)
Run Code Online (Sandbox Code Playgroud)
我应该关注哪些其他方面可能会导致问题.它可以在我链接的库中吗?我创建了第二个项目,只有这些代码行链接相同的库(但没有任何代码可以调用它们.)并且它不会崩溃.
问题解决了。
我想我会在这里添加它,以防其他人也做过同样的事情。
我慢慢地删除了项目中的文件以尝试找到有问题的文件。我认为它一定是头文件中定义的东西导致了问题(比如静态)。虽然花了很长时间,但我想我已经找到了。我有一个定义了许多结构的头文件。这些被序列化到线路,所以我使用 #pragma pack (push) 将它们对齐为 1 字节,我将其放在文件顶部,将 #pragma pack (pop) 放在底部。但随后我在第一个 #pragma 定义之后添加了一些 #include 语句,这意味着这些包含内容未正确对齐并导致一些不确定的行为。感谢所有看过的人。可能应该使用属性语法,我就不会遇到问题。为了完整性起见,有问题的代码如下。
#pragma pack (push)
#pragma pack (1)
#include <string> //Wrong place for includes!
#include <Units.h>
typedef struct
{
....
}
#pragma pack (pop)
Run Code Online (Sandbox Code Playgroud)
感谢所有看过最初问题的人。
| 归档时间: |
|
| 查看次数: |
1616 次 |
| 最近记录: |