English 中文(简体)
C++ 函数中的静态加倍
原标题:array of pointers to static doubles in C++ function
  • 时间:2012-05-24 22:27:57
  •  标签:
  • c++
  • c
  • static

我喜欢对静态数据有一系列指示器。 例如,

  void func(...) {
     ...
     static int mysize = initial_size;
     static double* d[3] = {new double[mysize], new double[mysize], new double[mysize]};
     for(int i=0; i < 3; ++i) {
        if(cond) {
           //-re-allocate d if necessary.
           use d here;
        }
        else {
           use d here;  //-since d is static; it persists and so this is justified?
        }
     }
     //-Can I get away with not deleting d here??
  }

我的推理是,由于 d 是一系列静态双倍的指针; 它被分配到函数内部一次, 所以当一切超出范围时, 它有望被删除吗? 我不知怎么地认为不是。 这也许是一厢情愿的想法,并导致记忆泄漏?

或许我最好在这里使用静态的 C++ 矢量 。 我想在这里使用静态的 C++ 矢量 。 我想在这里使用静态的数据,以便在满足某些条件(例如,如果满足了某些条件,比如,如果满足了某些条件,比如控制或否定等条件)时,在 d 中重新使用先前计算和储存的数据。 希望这能让任何想法都有意义并提前感谢。

最佳回答

@AdamLiss如上所述, 若您在重新配置前不小心删除现有的数组, 您可以在 < em> re- dispallate d( 需要的话) < / em > 阶梯上泄漏内存 :

void func(...) {
  static int mysize = initial_size;
  static double* d[3] = {new double[mysize], new double[mysize], new double[mysize]};
  for(int i=0; i < 3; ++i) {
    if(cond) {
      d[i] = new double[2*mysize];  // LEAK!
      use d here;

即使你记得像这样删除它:

void func(...) {
  static int mysize = initial_size;
  static double* d[3] = {new double[mysize], new double[mysize], new double[mysize]};
  for(int i=0; i < 3; ++i) {
    if(cond) {
      delete[] d[i];
      d[i] = new double[2*mysize];

s there a bug, 因为新分配可能会丢弃一个例外, 留下 d[0] 指向删除的内存, 但无法告诉它, 所以当下次函数被调用时, 如果 d[0] 被删除, 它将是未定义的行为 。

这将是确定的:

void func(...) {
  static int mysize = initial_size;
  static double* d[3] = {new double[mysize], new double[mysize], new double[mysize]};
  for(int i=0; i < 3; ++i) {
    if(cond) {
      double* tmp = new double[2*mysize];
      std::swap(tmp, d[i]);
      delete[] tmp;

但如果您使用矢量管理动态内存, 您将会避免此类问题 :

void func(...) {
  int mysize = initial_size;
  typedef std::vector<double> dvec;
  static dvec d[3] = {dvec(mysize), dvec(mysize), dvec(mysize)};
  for(int i=0; i < 3; ++i) {
    if(cond) {
      //-re-allocate d if necessary.
      d[i].resize(2*mysize);
      use d here;
    }
    else {
      use d here;
    }
  }
}

这也具有以下优点:能够通过 d[i]. size() 查询现有大小,在重新配置时不必手工将旧数组的元素复制到新数组

问题回答

删除 d 将是一个错误,因为它没有被分配到 new 。 但是,由于单个元素 re 被分配到 new ,你需要小心避免遗漏他们的记忆。

你的代码基本上可以,虽然有影响:

  • 净化、保险和Valgrind等内存-使用检查工具可能会报告更多关于潜在内存泄漏的噪音,但其本身只是噪音。

  • stistic 使得创建线形安全代码更加困难 -- -- 将调用员通过 d 作为 func 的函数参数,允许使用线形特定副本、应用程序区域特定副本、较容易的单位测试而不必重新启动进程,以及用户对寿命的全部控制。

  • 说您的应用程序引入了一个额外的阶段/ 阶段, 在连接 < code> func () 的电话完成后, 它在关闭前开始做一些其他的内存密集计算 - 内存仍将被分配。 这对您可能无关紧要, 特别是如果您拥有大量虚拟地址空间, 并且可以将它转换为磁盘, 但随着代码的演变, 它是一个额外的潜在维护问题 。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签