当我尝试删除 leveldb 实例时,我得到了一些非常烦人的断言,但我不确定它为什么会发生!
断言发生在version_set.cc文件中:
void VersionSet::AppendVersion(Version* v) {
// Make "v" current
assert(v->refs_ == 0); // <---??? how do I avoid this assertion?
// the rest of the source code is available in the link to version_set.cc
}
此外,它在同一文件的另一个位置断言:
Version::~Version() {
assert(refs_ == 0); // <-- Again... how do I avoid this one too?
// the rest of the source code is available in the link to version_set.cc
}
这是有关我系统中使用情况的更多背景详细信息,我有一个:
ExtStorage
具有LevelDB::DB
实例的类(扩展存储)。- class
EextStorageDotNet
,它是ExtStorage
. - class
AltStorage
,它包含一个指向 ExtStorage 类的指针(通过构造函数传递): - class
AltStorageDotNet
,它是AltStorage
.
备用存储类如下所示:
class AltStorage{
ExtStorage* instance;
public:
AltStorage(ExtStorage* extStorage):instance(extStorage){}
~AltStorage(){
delete instance;
instance = NULL;
}
};
该类ExtStorage
如下所示:
class ExtStorage{
leveldb::DB* mydb;
public:
ExtStorage(/*some parameters*/){
mydb = new leveldb::DB(/*parameters*/);
}
// Destructor
~ExtStorage() {
Close();
}
// deletes the leveldb::DB instance
void Close() {
if(mydb == NULL) {
delete mydb; // <-- Asserts every time I get here when using with the AltStorageDotNet
mydb= NULL;
// Close the L1 and L2 caches
// only once (
}
}
}
该类AltStorageDotNet
如下所示:
public ref class AltStorageDotNet{
AltStorage* altInstance;
ExtStorageDotNet^ extInstance;
public:
AltStorageDotNet() {
ExtStorage extStorage = new ExtStorage(/*params*/);
altInstance = new AltStorage(extStorage);
extInstance = gcnew ExtStorageDotNet(extStorage);
}
~AltStorageDotNet(){
delete altInstance;
altInstance = NULL;
// no need to delete extInstance since it was created with gcnew
}
!AltStorageDotNet(){
delete altInstance;
altInstance = NULL;
// no need to delete extInstance since it was created with gcnew
}
inline ExtStorageDotNet^ GetExtInstance(){return extInstance;}
};
DotNet 包装器如下所示:
public ref class ExtStorageDotNet{
private:
ExtStorage* instance;
public:
ExtStorageDotNet(ExtStorage* extStorage){
instance = extStorage;
}
~ExtStorageDotNet(){
delete instance;
instance = NULL;
}
!ExtStorageDotNet(){
delete instance;
instance = NULL;
}
void Close(){instance->Close();}
};
每当我ExtStorageDotNet
在我的 C# 应用程序中使用包装器时,一切正常,并且没有断言。但是,当我使用AltStorageDotNet
包装器并访问ExtStorageDotNet
包装器时,我会在关闭数据库时获得断言。这是测试套件的所有部分,我在其中为每个测试用例初始化一个实例并在每个测试用例之后关闭它;在新的测试用例开始之前,相关的数据库文件会被删除。我看不出它应该发生的任何原因,并且断言对追踪问题没有帮助。