0

我在我的代码中使用 STL 映射。其中一个功能是使用全局声明的 MAP,它给出了分段错误。但是,如果我将该 MAP 作为局部变量,它的工作正常。以下功能创建问题。

typedef map<int,string> DebugAllocPtrList_t;    
DebugAllocPtrList_t DebugAllocPtrList;    

int g_DebugAllocCount;


void DebugAllocNew(void *x, char *szFile, int iLine)
{        
    char szBuf[512];
    szBuf[0]=0; 
    sprintf(szBuf,"%s line %d", szFile, iLine);

    printf("Memory already allocated");

    DebugAllocPtrList[(int)x] = szBuf; //here it gives fault when declared globally.        
    g_DebugAllocCount++;    
}

如果我独立运行这个函数,它的工作。但是当我把这个函数放到我的实际代码中时,它会给出分段错误。如果我让 DebugAllocPtrList_t DebugAllocPtrList; 变量本地然后我也会工作。

4

1 回答 1

3

我想将您的代码重写为以下代码,没有混合的 C/C++ 代码,没有全局变量等,更多的 C++ 方式:

typedef map<int,string> DebugAllocPtrList_t;    

void incrementCount()
{
  static int g_DebugAllocCount = 0;
  g_DebugAllocCount++;
}

std::string makeString(const std::string& file, int line)
{
  std::stringstream ss;
  ss << file << " line " << line;
  return ss.str();
}

void DebugAllocNew(DebugAllocPtrList_t& ptr_map, int x, const std::string& file, int line)
{  
  std::cout <<"Memory already allocated" <<std::endl;
  ptr_map[x] = makeString(file, line);

  incrementCount();
}

int main()
{  
  DebugAllocPtrList_t t;

  DebugAllocNew(t, "something", 1, 2);
  DebugAllocNew(t, "something", 1, 2);
} 
于 2013-01-18T11:59:48.700 回答