управление памятью для вектора в c ++, когда вектор является глобальной переменной - PullRequest
0 голосов
/ 04 ноября 2018

Я работаю над большой базой кода C ++, которую я компилирую с помощью Borland C ++ (6.0) Builder. Я ввел код, чтобы при выполнении сценария можно было записать каждый метод, который получил удар. По этой причине я сохраняю глобальный вектор и выполняю импорт файла, содержащего глобальную переменную.

Заголовочный файл (Global.h), имеющий глобальную переменную-

#include <iostream>
#include <vector>
#include <string>

using namespace std;

extern vector<string> tracerVector;

и файл реализации, Global.cpp-

#include "Global.h"

vector<string> tracerVector;

Я включаю заголовочный файл во все файлы, которые я хочу отследить.

Ниже приведен только метод ввода образца.

#include <vcl.h>
#pragma hdrstop

#include "MainWindow.h"
#include "Product.h"
#include "Global.h"

using namespace std;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TmainForm *mainForm;
//---------------------------------------------------------------------------
__fastcall TmainForm::TmainForm(TComponent* Owner): TForm(Owner)
{
    TComponent *senderObj = (TComponent*)Owner;
    std::string injection = ("Type:" + AnsiString(senderObj->ClassName()) + " Object:" + AnsiString(senderObj->Name)).c_str();  
    std::string finalStatement = (injection + " methodName:TmainForm").c_str();
    if(!tracerVector.empty()){ 
     if(tracerVector.back() != finalStatement){
        tracerVector.push_back(finalStatement);
        }
    }
    else if(tracerVector.empty()){
        tracerVector.push_back(finalStatement);
    }
}

При малом сценарии с точки зрения нет. из обязательных методов, работает нормально, но если нет. из обязательных методов становится больше, я получаю следующее исключение -

size_type size() const { return this->_M_finish - this->_M_start; }

Я подозреваю, что мой глобальный размер вектора вызывает это исключение. Пожалуйста, предложите мне, как я могу держать весь путь выполнения. Мне нужно записать содержимое этого глобального вектора в файл, когда выполнение завершено и пользователь выходит из приложения.

1 Ответ

0 голосов
/ 04 ноября 2018

Что означает @NathanOliver, подробно описано в книге «Эффективный C ++» Скотта Мейерса в пункте 4.

Если у вас есть статический глобальный объект, как в вашем случае, и если вы используете его между различными единицами перевода, то объект может быть неинициализирован в некоторых из них. Это потому, что относительный порядок инициализации нелокальных статические объекты, определенные в разных единицах перевода, не определены

Единицей перевода является исходный код со всеми его включениями, из которых генерируется объектный файл.

Решение для переноса инициализации внутри функции, такой как шаблон синглтона:

vector<string>& initTrace() 
{ 
    static vector<string> tracerVector; 
    return tracerVector;
}
...