我有一個std::vector需要在加載庫時填充一些隨機值。但我看到它在庫加載后被重置。是不是因為global和static
圖書館代碼:
static std::vector<uint8_t> g_randomNr{};
__attribute__((constructor)) void generateRandomNrAtStart(void)
{
static bool firstLoad = false;
g_randomNr.clear();
if (!firstLoad) {
firstLoad = true;
std::cout << "Library is loaded and generating first random number ...\n";
}
std::cout << "Generating random number ...\n";
for (int i = 0; i < 20; i ) {
g_randomNr.push_back(i);
}
std::cout << "Random number generated with length of " << g_randomNr.size() << "\n";
}
void getRandomNr(std::vector<uint8_t>& randomNr)
{
randomNr = g_randomNr;
}
主要代碼:
int main()
{
std::vector<uint8_t> randomNr{};
getRandomNr(randomNr);
std::cout << randomNr.size() << "\n";
return 0;
}
輸出:
Library is loaded and generating first random number ...
Generating random number ...
Random number generated with length of 20
0
在上面的輸出中,我希望 coutmain函式中有20 個,但我收到空的vector
uj5u.com熱心網友回復:
另一種選擇是使用優先級控制向量初始化和建構式呼叫的順序:
__attribute__((init_priority(101))) static std::vector<uint8_t> g_randomNr{};
__attribute__((constructor(102))) void generateRandomNrAtStart() { ... }
現場演示:https : //godbolt.org/z/bh9zj9cE3
可能是問題的 OT:請注意,std::cout在建構式中使用 I/O(如您的情況)可能會遇到同樣的問題。參見,例如,gcc 聯結器擴展 __attribute__((constructor)) 導致 main() 崩潰。
uj5u.com熱心網友回復:
您很可能正在遭受靜態初始化訂單慘敗。
我建議延遲初始化vector:
auto& instance() {
static std::vector<uint8_t> g_randomNr;
return g_randomNr;
}
然后在您的共享庫建構式中:
__attribute__((constructor)) void generateRandomNrAtStart(void)
{
auto& g_randomNr = instance();
// ...
并且在制作副本的功能中:
void getRandomNr(std::vector<uint8_t>& randomNr)
{
randomNr = instance();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/371376.html
上一篇:計算BST中小于X的元素數
下一篇:關于C 多型函式的問題
