fixed bug with deletion from std::map
This commit is contained in:
@@ -149,8 +149,8 @@ namespace cv
|
|||||||
VizStorage(); // Static
|
VizStorage(); // Static
|
||||||
~VizStorage();
|
~VizStorage();
|
||||||
|
|
||||||
static void add(Viz3d window);
|
static void add(const Viz3d& window);
|
||||||
static Viz3d get(const String &window_name);
|
static Viz3d& get(const String &window_name);
|
||||||
static void remove(const String &window_name);
|
static void remove(const String &window_name);
|
||||||
static bool windowExists(const String &window_name);
|
static bool windowExists(const String &window_name);
|
||||||
static void removeUnreferenced();
|
static void removeUnreferenced();
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ namespace cv { namespace viz
|
|||||||
cv::viz::VizMap cv::viz::VizStorage::storage;
|
cv::viz::VizMap cv::viz::VizStorage::storage;
|
||||||
void cv::viz::VizStorage::unregisterAll() { storage.clear(); }
|
void cv::viz::VizStorage::unregisterAll() { storage.clear(); }
|
||||||
|
|
||||||
cv::viz::Viz3d cv::viz::VizStorage::get(const String &window_name)
|
cv::viz::Viz3d& cv::viz::VizStorage::get(const String &window_name)
|
||||||
{
|
{
|
||||||
String name = generateWindowName(window_name);
|
String name = generateWindowName(window_name);
|
||||||
VizMap::iterator vm_itr = storage.find(name);
|
VizMap::iterator vm_itr = storage.find(name);
|
||||||
@@ -120,7 +120,7 @@ cv::viz::Viz3d cv::viz::VizStorage::get(const String &window_name)
|
|||||||
return vm_itr->second;
|
return vm_itr->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cv::viz::VizStorage::add(Viz3d window)
|
void cv::viz::VizStorage::add(const Viz3d& window)
|
||||||
{
|
{
|
||||||
String window_name = window.getWindowName();
|
String window_name = window.getWindowName();
|
||||||
VizMap::iterator vm_itr = storage.find(window_name);
|
VizMap::iterator vm_itr = storage.find(window_name);
|
||||||
@@ -136,9 +136,11 @@ bool cv::viz::VizStorage::windowExists(const String &window_name)
|
|||||||
|
|
||||||
void cv::viz::VizStorage::removeUnreferenced()
|
void cv::viz::VizStorage::removeUnreferenced()
|
||||||
{
|
{
|
||||||
for(VizMap::iterator pos = storage.begin(); pos != storage.end(); ++pos)
|
for(VizMap::iterator pos = storage.begin(); pos != storage.end();)
|
||||||
if(pos->second.impl_->ref_counter == 1)
|
if(pos->second.impl_->ref_counter == 1)
|
||||||
storage.erase(pos);
|
storage.erase(pos++);
|
||||||
|
else
|
||||||
|
++pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::String cv::viz::VizStorage::generateWindowName(const String &window_name)
|
cv::String cv::viz::VizStorage::generateWindowName(const String &window_name)
|
||||||
|
|||||||
@@ -62,7 +62,8 @@ cv::viz::Viz3d& cv::viz::Viz3d::operator=(const Viz3d& other)
|
|||||||
{
|
{
|
||||||
release();
|
release();
|
||||||
impl_ = other.impl_;
|
impl_ = other.impl_;
|
||||||
if (impl_) CV_XADD(&impl_->ref_counter, 1);
|
if (impl_)
|
||||||
|
CV_XADD(&impl_->ref_counter, 1);
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -89,10 +90,15 @@ void cv::viz::Viz3d::create(const String &window_name)
|
|||||||
void cv::viz::Viz3d::release()
|
void cv::viz::Viz3d::release()
|
||||||
{
|
{
|
||||||
if (impl_ && CV_XADD(&impl_->ref_counter, -1) == 1)
|
if (impl_ && CV_XADD(&impl_->ref_counter, -1) == 1)
|
||||||
|
{
|
||||||
delete impl_;
|
delete impl_;
|
||||||
|
impl_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (impl_ && impl_->ref_counter == 1)
|
||||||
|
VizStorage::removeUnreferenced();
|
||||||
|
|
||||||
impl_ = 0;
|
impl_ = 0;
|
||||||
VizStorage::removeUnreferenced();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cv::viz::Viz3d::spin() { impl_->spin(); }
|
void cv::viz::Viz3d::spin() { impl_->spin(); }
|
||||||
|
|||||||
Reference in New Issue
Block a user