向量是全局变量时,在c ++中向量的内存管理

时间:2018-11-04 03:18:12

标签: c++ vector memory-management global-variables

我正在使用Borland C ++(6.0)Builder编译大型C ++代码库。我注入了代码,以便在执行场景时可以记录命中的每个方法。 因此,我保留了一个全局向量,并确实导入了包含全局变量的文件。

具有全局变量的头文件(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 :(得分:0)

@NathanOliver的含义在Scott Meyers的有效C ++书中的第4项中进行了详细说明。

如果您有一个静态的全局对象(视情况而定),并且在不同的翻译单元之间使用它,则其中的某些对象可能未初始化。这是因为非本地初始化的相对顺序 未定义在不同翻译单元中定义的静态对象

翻译单元是包含所有包含内容的源代码,可从中生成目标文件。

一种将初始化包装在诸如单例模式之类的函数中的解决方案:

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