问题标签 [static-variables]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
1787 浏览

c - 静态函数范围指针和内存泄漏

我编写了一个简单的库文件,其中包含一个从任意大小的文件中读取行的函数。该函数通过传入堆栈分配的缓冲区和大小来调用,但如果行太大,则初始化一个特殊的堆分配缓冲区并用于传回更大的行。

这个堆分配的缓冲区是函数范围的并声明为静态的,当然在开始时初始化为 NULL。我在函数开头写了一些检查,检查堆缓冲区是否为非空;如果是这种情况,则上一行读取的内容太长。自然地,我释放了堆缓冲区并将其设置回 NULL,认为下一次读取可能只需要填充堆栈分配的缓冲区(即使在我们的应用程序中,应该很少看到超过 1MB 的行!)。

通过仔细阅读和运行一些测试,我已经仔细阅读了代码并对其进行了相当彻底的测试。我有理由相信保持以下不变量:

  • 如果只需要堆栈缓冲区,则函数返回时堆缓冲区将为空(并且不会泄漏任何内存)。
  • 如果堆缓冲区不为空,因为它是需要的,它将在下一个函数调用时被释放(如果需要,可能在下一行中重用)。

但是我想到了一个潜在的问题:如果文件中的最后一行太长,那么由于该函数可能不会再次调用,我不确定我有什么方法可以释放堆缓冲区——它是函数毕竟,范围很广。

所以我的问题是,如何在函数范围的静态指针中释放动态分配的内存,最好不要再次调用该函数?(理想情况下也不要让它成为全局变量!)

可根据要求提供代码。(抱歉,我现在无法访问。而且我希望这个问题足够笼统且解释清楚,因此不需要它,但无论如何,请随时消除我的这个想法!)


编辑:我觉得我应该添加一些关于函数用法的注释。

这个特定的函数以从文件中连续读取行的形式使用,然后立即复制到 POD 结构中,每个结构一行。这些是在读取文件时在堆上创建的,并且每个结构都有一个 char 指针,其中包含文件中的一行(清理后的版本)。为了使这些持续存在,必须进行复制。(这是许多答案中提出的主要反驳之一——哦,不,需要复制这条线,哦,亲爱的我)。

至于多线程,正如我所说,这是为了串行使用而设计的。不,它不是线程安全的,但我不在乎。

不过,感谢您的众多回复!当我有时间时,我会更彻底地阅读它们。目前,我倾向于传递一个额外的指针或重新设计函数,以便在fgets显示 EOF 时,我可能只是在那里构建释放逻辑,希望用户不必担心它。

0 投票
5 回答
2269 浏览

javascript - 如何在回发的 JavaScript 函数中保留静态变量值?

我在下面有这个样本:

当我在页面上单击回发时,我发现已初始化的变量(在函数本身上定义)正在失去其值并再次变为“未定义”。

是否可以在定义这些静态值后保留它们并使它们不受页面上任何回发的影响?

0 投票
5 回答
5723 浏览

c++ - Static variables in instance methods

Let's say I have this program:

(Of course this example makes no sense since I'd obviously declare "counter" as a private attribute, but it's just to illustrate the problem).

I'd like to know how C++ behaves in this kind of situation: will the variable "counter" in the bar() method be the same for every instance?

0 投票
7 回答
1094 浏览

php - PHP:我只能使用这个函数一次(在一个while循环中使用它)

我得到了一个几乎可以正常工作的旧问题的答案。

我有一个功能,

我想这样使用

该功能工作正常,但是,我每页只能使用一次。我第二次调用它时,它什么也没做。也没有错误,就像函数从未发生过一样。

为了让它多次工作并且仍然在while循环中工作,我必须改变什么?

0 投票
3 回答
12068 浏览

c - 如何从 C 中的另一个文件访问静态变量?

可能重复:
静态变量

如何从 C 中的另一个文件访问静态变量?由于静态变量具有文件范围,我认为我们无法在文件之外访问它。但我仍然觉得可能有一些技巧或方法可以做到这一点。

0 投票
2 回答
2372 浏览

c - 如何从另一个文件访问静态变量?

如何从另一个文件访问静态变量?静态变量没有文件范围吗?

0 投票
3 回答
1907 浏览

c++ - 可以使用静态变量来初始化/注册变量吗?

语言:C++ 工具包:Qt4

我正在使用的工具包有一个调用int QEvent::registerEventType()来注册我自己的事件类型的静态方法。当我对它进行子类化时,QEvent我需要为基类提供这个值。QEvent::QEvent(int type).

可以在应用程序启动之前使用静态变量来调用它吗?考虑以下:

这有多“邪恶”?我可以将整个东西包装在一个命名空间中,以防止污染全局命名空间。

0 投票
4 回答
1157 浏览

.net - 静态 int 变量需要多少字节?

0 投票
5 回答
4711 浏览

php - 用于优化的静态变量

我想知道是否可以使用静态变量进行优化:

我知道一旦$i被初始化,它就不会被连续调用的那行代码改变Bar()。我认为这意味着moderatelyExpensiveFunctionCall()每次我打电话时都不会对其进行评估,但我想确定一下。

一旦 PHP 看到一个已初始化的静态变量,它会跳过那行代码吗?换句话说,如果我对 进行大量调用,这会优化我的执行时间Bar(),还是我在浪费时间?

0 投票
4 回答
1430 浏览

c++ - 如何创建一次评估局部静态变量的静态方法?

我有一个带有静态方法的类,它有一个局部静态变量。我希望该变量被计算/评估一次(我第一次调用该函数)并且对于任何后续调用,它不再被评估。怎么做?这是我的课:

编辑:

感谢大家的及时帮助。对所有人+1。我选择了 Tyler McHenry 的答案,因为它不需要任何比较,纯静态函数评估。我将需要此代码用于分配器,因此避免另一个“如果”应该更好。再次感谢!

编辑:

gf 的答案被证明是最好的答案,因为它在编译时处理分配并将程序从线程安全头痛和显式初始化中拯救出来。但是,我尊重以前的最佳答案。我将在此处给予信用,而不是更改刻度线。感谢大家的帮助!