Сбой освобождения члена std :: string [] во время исключения, генерируемого конструктором - PullRequest
0 голосов
/ 19 декабря 2018

Использование Visual Studio 2015 (обновление 3) У меня есть проблема в более крупном проекте, который я сводил к минимальному примеру ниже.

Там у меня есть класс Test, содержащий std :: string [3].Может случиться так, что конструктор Test сгенерирует исключение, с которым я бы хотел иметь дело на верхнем уровне (main).Однако при вызове из конструктора утверждение в xmemory не выполняется - мне кажется, что при попытке размотать и освободить std :: string [3] (см. Вывод консоли и трассировку стека ниже).Оператор catch никогда не достигается, и в построенной версии он просто падает.

Когда я заменяю std :: string [3] одной строкой std :: string, оператор catch достигается правильно.Кроме того, когда выдается исключение из другой функции-члена, вызываемой извне после завершения построения, блок catch достигается, как ожидается, при использовании std :: string [3].

Что здесь происходит? Любая помощь приветствуется.

Минимальный пример:

#include "stdafx.h"
#include <vcruntime_exception.h>
#include <string>
#include <iostream>



class Test {
public:
    Test() {
        // throw exception from constructor
        throw std::exception("TestException");
    }

    ~Test() {
        std::cout << "Destruction" << std::endl;
    }

    //std::string mySingleString = "SingleTestString";
    std::string myStrings[3] = { "String1", "TestString2", "AnotherTestString" };
};


int main()
{
    try
    {
        Test* t = new Test();
    }
    catch (std::exception& e)
    {
        // this is never reached while std::string myStrings is not uncommented
        std::cout << "Caught:" << e.what() << std::endl;
    }
    catch (...) {
        std::cout << "Caught an alien!" << std::endl;
    }
    return 0;
}

Вывод на консоль:

Ausnahme ausgelöst bei 0x773CDDC2 in ConsoleApplication1.exe: Microsoft C++-Ausnahme: std::exception bei Speicherort 0x0019FB8C.
"ConsoleApplication1.exe" (Win32): "C:\Windows\SysWOW64\kernel.appcore.dll" geladen. Symbole wurden geladen.
"ConsoleApplication1.exe" (Win32): "C:\Windows\SysWOW64\msvcrt.dll" geladen. Symbole wurden geladen.
"ConsoleApplication1.exe" (Win32): "C:\Windows\SysWOW64\rpcrt4.dll" geladen. Symbole wurden geladen.
"ConsoleApplication1.exe" (Win32): "C:\Windows\SysWOW64\sspicli.dll" geladen. Symbole wurden geladen.
"ConsoleApplication1.exe" (Win32): "C:\Windows\SysWOW64\cryptbase.dll" geladen. Symbole wurden geladen.
"ConsoleApplication1.exe" (Win32): "C:\Windows\SysWOW64\bcryptprimitives.dll" geladen. Symbole wurden geladen.
"ConsoleApplication1.exe" (Win32): "C:\Windows\SysWOW64\sechost.dll" geladen. Symbole wurden geladen.
Debug Assertion Failed!

Program: ...15\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe
File: c:\program files (x86)\microsoft visual studio 14.0\vc\include\xmemory0
Line: 100

Expression: "(_Ptr_user & (_BIG_ALLOCATION_ALIGNMENT - 1)) == 0" && 0

Трассировка стека:

ConsoleApplication1.exe!std::_Deallocate(void * _Ptr, unsigned int _Count, unsigned int _Sz) Zeile 99   C++
ConsoleApplication1.exe!std::allocator<char>::deallocate(char * _Ptr, unsigned int _Count) Zeile 720    C++
ConsoleApplication1.exe!std::_Wrap_alloc<std::allocator<char> >::deallocate(char * _Ptr, unsigned int _Count) Zeile 988 C++
ConsoleApplication1.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(bool _Built, unsigned int _Newsize) Zeile 2260  C++
ConsoleApplication1.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() Zeile 1018 C++
ConsoleApplication1.exe!`eh vector destructor iterator'(void * ptr, unsigned int size, unsigned int count, void(*)(void *) destructor)  C++
ConsoleApplication1.exe!_main() C++
ConsoleApplication1.exe!main() Zeile 27 C++

1 Ответ

0 голосов
/ 19 декабря 2018

С помощью комментаторов это, скорее всего, стало проблемой с инициализаторами элементов по умолчанию и Visual Studio 2015.

Без инициализаторов по умолчанию это работает.

...