va_arg导致std :: bad_alloc

时间:2016-12-08 03:14:54

标签: c++ c++11 bad-alloc variadic-functions

每当我运行程序时,都会抛出std::bad_alloc异常,导致中止。调用va_arg时,std::bad_alloc仅会被抛出。奇怪的是崩溃的代码是由教师提供的。我没有写出崩溃的线路。 Valgrind告诉我这是由new/new[]引起的。为什么va_arg会导致这种情况? bad_alloc仅在执行时发生(在其他地方也会发生)。

void Library::addKeywordsForItem(const Item* const item, int nKeywords, ...)
 {
     // the code in this function demonstrates how to handle a vararg in C++

     va_list         keywords;
     string          keyword = "test";
     bool            successFlag = false;
     sArray          keywordV;
     cout << "Before lookupItem\n";
     Item*           item2 = lookupItem(item);
     cout << "After lookupItem\n";

     va_start(keywords, nKeywords);
     cout << "after va_start\n";
     for (int i = 0; i < nKeywords; i++) //this code adds the items to a map of set to create a fast access structure for keyword searches
     {
         cout << "before keyword assign\n";
         keyword = va_arg(keywords, string); //Crash here
         cout << "after keyword assign\n";
         // do something with each keyword
         cout << "before HERE\n";
         keywordV.push_back(keyword); //pushes keyword onto vector
         cout << "HERE\n";
         successFlag = addToSMap(item, keyword, keywordDbase); //This function is literally a copy/paste of the code
         //originally designed for this function
     }
     va_end(keywords);

     //Sets in keywords
     item2->setKeywords(keywordV);

     if(!successFlag) //Should never execute
         cout << "This code reeks verily of wrongness.\n";
 }

上面的代码是从以下教师编写的代码行中调用的

library->addKeywordsForItem(item, 2, "autism", "Asperger's Syndrome");

以下是我得到的错误

Valgrind的

**5851**    new/new[] failed and should throw an exception, but Valgrind
**5851**    cannot throw exceptions and so is aborting instead.  Sorry.
==5851==    at 0x4C275AC: ??? (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==5851==    by 0x4C27DC6: operator new(unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==5851==    by 0x4F57496: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.tcc:265)
==5851==    by 0x4F577E8: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:1181)
==5851==    by 0x4085F8: Library::addKeywordsForItem(Item const*, int, ...) (Library.cpp:79)
==5851==    by 0x401BB5: main (Asgmt04.cpp:38)

程序

  

在抛出&#39; std :: bad_alloc&#39;
的实例后终止调用   what():std :: bad_alloc Aborted

教师设计了使用va_args的循环(我刚刚填写了它的内容)所以我不确定为什么他的代码会导致崩溃。我的代码会导致崩溃吗?有人能提供一些见解吗?

1 个答案:

答案 0 :(得分:4)

"autism""Asperger's Syndrome"const char *个值,而不是string个值,因此尝试将它们读为string会导致未定义的行为。