当vector是全局变量时,C++中vector的内存管理

Posted

技术标签:

【中文标题】当vector是全局变量时,C++中vector的内存管理【英文标题】:memory management for vector in c++ when vector is tje global variable 【发布时间】:2018-11-04 03:18:11 【问题描述】:

我正在使用 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; 

我怀疑我的全局向量大小触发了这个异常。请建议我如何保持整个执行路径。当执行完成并且用户退出应用程序时,我需要将此全局向量的内容写入文件。

【问题讨论】:

听起来像是一个静态初始化订单惨败问题。没有minimal reproducible example,虽然我们不能说。 不确定我应该提供什么信息才能让我的问题更容易理解。能详细点吗? 请提供您遇到的实际错误。您只提供了标准库中的一行代码,而不是错误消息。 对不起,我应该说异常,而不是错误。我编辑了我的帖子,但我在帖子中提供的内容除外。 【参考方案1】:

@NathanOliver 的含义在 Scott Meyers 的 Effective C++ 一书中的第 4 项中有详细说明。

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

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

一种将初始化封装在一个函数中的解决方案,例如单例模式:

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

【讨论】:

静态变量不应该是引用。 @Natasha 你可以做 initTrace().push_back() 或者你可以做 vector& v = initTrace(); v.push_back()

以上是关于当vector是全局变量时,C++中vector的内存管理的主要内容,如果未能解决你的问题,请参考以下文章

C++容器Vector问题

c++ 全局变量初始化(initializer_list的向量)

在多线程 C++ 程序中使用 std::vector 时应用程序崩溃

C++的vector学习

关于C++ vector的拷贝

vector 内存泄漏问题?