Общие библиотеки и глобальные проблемы с std :: string в Linux - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть класс, состоящий исключительно из статических классов в одном .so, который вызывается из других .so с, но при выходе из программы при valgrind я получаю двойную ошибку, которая говорит:

==23162== Invalid free() / delete / delete[] / realloc()
...
==23162==  Address 0xe187d70 is 0 bytes inside a block of size 97 free'd
...
==23162==  Block was alloc'd at
....
==23162==    by 0x165C0C90: FileManager::setCommonConfigFolder(...)
             (in .../lib2.so)

Код на самом деле lib1.so, но вызывается из lib2.so.

Оглядываясь вокруг, я вижу этот ответ :

Нет, это не общий доступ - раздел кода / текста библиотеки является общим - часть данных уникальна для каждого процесса, который использует библиотеку

Так, каково время для освобождения статических объектов, выделенныхдействия клиента библиотеки?Как избежать этой проблемы?

Соответствующие части кода следующие.Это компилируется в lib1.so и вызывается из lib2.so и lib3.so.При подходящем ведении журнала я вижу, что адрес в отчете valgrind Address 0xe187d70 is 0 bytes inside a block of size 97 free'd действительно mCommonConfigDirectory.data.

FileManager.cpp

#include "FileManager.h"
#include <string>

std::string FileManager::mCommonConfigDirectory = "../common/config";

void FileManager::setCommonConfigFolder (std::string const& configPath)
{
    mCommonConfigDirectory = configPath;
}

FileManager.h

#include <string>

class FileManager
{
public:
    static void setCommonConfigFolder (std::string const& configPath);

protected:
    static std::string mCommonConfigDirectory;
};
...