我正在使用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; }
我怀疑我的全局向量大小正在触发此异常。请建议我如何保留整个执行路径。当执行完成并且用户退出应用程序时,我需要将此全局向量的内容写入文件。
答案 0 :(得分:0)
@NathanOliver的含义在Scott Meyers的有效C ++书中的第4项中进行了详细说明。
如果您有一个静态的全局对象(视情况而定),并且在不同的翻译单元之间使用它,则其中的某些对象可能未初始化。这是因为非本地初始化的相对顺序 未定义在不同翻译单元中定义的静态对象
翻译单元是包含所有包含内容的源代码,可从中生成目标文件。
一种将初始化包装在诸如单例模式之类的函数中的解决方案:
vector<string>& initTrace()
{
static vector<string> tracerVector;
return tracerVector;
}