有谁知道为什么在dlopen()中初始化的库会初始化主程序拥有的静态变量.主程序和共享库都有静态变量的副本,但由于某种原因,共享库重新初始化主程序的静态变量副本并对其进行破坏,在主程序试图破坏它时导致段错误.
这是在符号表中出现错误名称的情况吗?
symbols shared-libraries static-variables segmentation-fault dlopen
我有这些C++类:
class Base
{
protected:
static int method()
{
static int x = 0;
return x++;
}
};
class A : public Base
{
};
class B : public Base
{
};
Run Code Online (Sandbox Code Playgroud)
将x静态变量之间共享A和B,或将他们中的每一个都有它自己的独立x变量(这是我想要什么)?
<?php
class Stat
{
public $var1='H';
public static $staticVar = 'Static var';
static function check()
{
echo $this->var1;
echo "<br />".self::$staticVar ."<br />";
self::$staticVar = 'Changed Static';
echo self::$staticVar."<br />";
}
function check2()
{
Stat::check();
echo $this->var1;
echo "b";
}
}
?>
Run Code Online (Sandbox Code Playgroud)
我可以像这样使用它吗?
$a = new Stat();
$a->check2();
Run Code Online (Sandbox Code Playgroud) 我希望具有相同的静态变量,具有不同的值,具体取决于类的类型.
所以我会的
public class Entity
{
public static Bitmap sprite;
public void draw(Canvas canvas, int x, int y)
{
canvas.drawBitmap(sprite, x, y, null);
}
}
public class Marine extends Entity
{
}
public class Genestealer extends Entity
{
}
Run Code Online (Sandbox Code Playgroud)
然后在我的主程序中去:
Marine.sprite = // Load sprite for all instances of Marine
Genestealer.sprite = // Load sprite for all instances of Genestealer
Run Code Online (Sandbox Code Playgroud)
我不想在类的每个实例中存储相同的sprite.我希望每种类型都有一个.我想继承静态精灵变量和绘制精灵的绘制函数.但我不希望Genstealer精灵覆盖海洋精灵.
这可能吗?
我该怎么办?
在子类中没有任何代码的情况下,我希望抽象类为每个子类提供不同的静态变量副本.在C#中
abstract class ClassA
{
static string theValue;
// just to demonstrate
public string GetValue()
{
return theValue;
}
...
}
class ClassB : ClassA { }
class ClassC : ClassA { }
Run Code Online (Sandbox Code Playgroud)
和(例如):
(new ClassB()).GetValue(); // returns "Banana"
(new ClassC()).GetValue(); // returns "Coconut"
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案是:
abstract class ClassA
{
static Dictionary<Type, string> theValue;
public string GetValue()
{
return theValue[this.GetType()];
}
...
}
Run Code Online (Sandbox Code Playgroud)
虽然这很好用,但我想知道是否有更优雅或内置的方式来做到这一点?
这类似于我可以为每个不同类型的继承类拥有静态变量的不同副本,但我无法控制子类
我知道constexpr 变量可以在编译时使用.例如,对于模板或静态asser.
但如果我想在没有constexpr的情况下这样做,我可以static const.
什么是自C++ 11/14引入constexpr之间的区别
constexpr int a = 3;
//AND
static const int a = 3;
Run Code Online (Sandbox Code Playgroud)
谢谢!
另一种看待这个问题的方法是我应该使用哪种方法?
以下两个static变量声明是否相同?
1.
static int var1;
static int var2;
static int var3;
Run Code Online (Sandbox Code Playgroud)
2.
static int var1, var2, var3;
Run Code Online (Sandbox Code Playgroud)
更具体地说,在案例2中,所有变量都是static,或者只是var1?
我最近遇到的问题是如何访问一个在file1.c中声明为static的变量到另一个file2.c?
是否可以访问静态变量?
我对C中静态关键字的理解是,
static是"内部链接",因此只能从一个编译单元访问它们 - 它们被定义的单元.使用内部链接声明的对象是单个模块的私有对象.
正如我的一位朋友建议我解决方案.
在 file1.c
#include <stdio.h>
int main()
{
int b=foo();
printf("%d",b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在 file2.c
static int a=25;
int foo()
{
return a;
}
Run Code Online (Sandbox Code Playgroud)
汇编 gcc file1.c file2.c -o file
如果我在上面,我可以访问变量.
所以我的问题是:
上述程序是否违反静态变量规则?
如果没有,为什么会这样,除了包括file(#include <…>)之外,还有其他方法可以访问静态变量.
如果我对静态变量概念有误,并且有更好的解决方案可用于访问静态变量,请纠正我?
我想知道实际情况是什么,编译器如何处理静态变量.与自动变量不同,静态变量的值即使在块结束后仍然存在,但编译器实际上如何处理这个?
是否在函数体中静态定义了互斥锁,能够正确锁定?我目前在我的记录器系统中使用这种模式,但我还没有测试它的线程安全性.
void foo () {
static std::mutex mu;
std::lock_guard<std::mutex> guard(mu);
...
}
Run Code Online (Sandbox Code Playgroud) static-variables ×10
c ×3
c++ ×3
inheritance ×3
c# ×1
c++11 ×1
constexpr ×1
declaration ×1
dlopen ×1
java ×1
mutex ×1
php ×1
static ×1
symbols ×1