У меня есть класс, состоящий исключительно из статических классов в одном .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;
};