我可以使用静态var来“缓存”结果吗? C ++

时间:2010-05-26 17:57:32

标签: c++ visual-c++ static

我正在使用一个返回char *的函数,现在我收到编译器警告“返回局部变量或临时地址”,所以我想我必须使用静态var作为返回,我的问题是否可以使if(var已设置)返回var else do do function并返回var?

这是我的功能:

char * GetUID()
{
   TCHAR buf[20];

   StringCchPrintf(buf, 20*sizeof(char), TEXT("%s"), 
            someFunction());

   return buf;
}

这就是我想要做的事情:

char * GetUID()
{
   static TCHAR buf[20];

   if(strlen(buf)!=0) return buf;

   StringCchPrintf(buf, 20*sizeof(char), TEXT("%s"), 
            someFunction());

   return buf;
}

这是静态变量的好用吗?我应该使用 ZeroMemory(& buf,20 * sizeof(char))?我删除它是因为如果我在if(strlen ...)之上使用它,我的TCHAR长度永远不会为0,我应该在下面使用它吗?

5 个答案:

答案 0 :(得分:4)

您收到警告的原因是因为函数退出后,函数中为buf分配的内存将从堆栈中弹出。如果返回指向该内存地址的指针,则指向未定义的内存。它可能会起作用,也可能不起作用 - 无论如何都不安全。

通常,C / C ++中的模式是分配一块内存并将指向该块的指针传递给您的函数。 e.g。

void GetUID( char* buf )
{
    if(strlen(buf)!=0) return;

    StringCchPrintf(buf, 20*sizeof(char), TEXT("%s"), someFunction());
}

如果您希望函数(GetUID)本身处理缓存结果,那么您可以使用静态,单例(OOP)或考虑thread local storage。 (例如在Visual C ++中)

__declspec(thread) TCHAR buf[20];

答案 1 :(得分:3)

如果你的代码是单线程的,那没关系。当第一次输入函数时,缓冲区将被设置为包含全零,因此不需要将其内容显式设置为零。但是现在所有的代码最终都会变成多线程的,所以如果我是你,我就不会这样做。

答案 2 :(得分:2)

您应该做的是使用buf动态分配new,然后将其返回。但请注意,调用者将负责释放内存。

更好的是,使用std::string代替char *

答案 3 :(得分:1)

你可以这样做,但它不是线程安全的。您还应该小心处理结果,因为您无法在后续的函数调用之间存储它(当然不复制它)。

您还应该将静态变量初始化为空字符串。

答案 4 :(得分:0)

我就是这样做的。 它缓存;它不依赖于缓冲区为0。

它确实有一个隐含的假设,'buf'在线程之间是相同的,这是(据我所知)正确。我会为此目的使用全局。

//returns a newly allocated buffer, every time. remember to delete [] it.
char * GetUID()
{
   static TCHAR buf[20];
   static bool run = false;
   TCHAR ret_mem = new TCHAR[20];

   if(run) 
  { return ret_mem; }

  //do stuff to the buf
  //assuming - dst, src, size. 
  memcpy(ret_mem, buf, 20);

  run = true;
  return ret_mem;
}
相关问题