如何检查无效的 address/deleted 指针?
How to check invalid address/deleted pointer?
我是 c++
的新手,我被这个问题困住了。
我将一个结构指针(Bar*)附加到一个向量,该结构有一个指针 class 成员(Foo*)。
struct Bar
{
const int var{ 0 };
Foo* m_foo{ nullptr };
};
std::vector<Bar*> list;
int main()
{
Bar* p_Bar = new Bar;
p_Bar->m_foo = new Foo;
list.emplace_back(p_Bar);
}
我有一个线程检查这些指针的有效性。删除这些指针后,矢量元素应该存在,我应该检查两个指针是否有效。
当其中任何一个无效时,我应该删除该矢量元素(我的意思是检查后)。
这是我的尝试:
#include <iostream>
#include <vector>
#include <thread>
class Foo
{
public:
Foo() {};
const int var{ 5 };
};
struct Bar
{
const int var{ 0 };
Foo* m_foo{ nullptr };
};
std::vector<Bar*> list;
bool _check = true;
void Check()
{
while (_check)
{
for (int c = 0; c < (int)list.size(); c++)
{
Bar* p = list[c];
if (p)
{
if (p->m_foo)
{
std::cout << "m_foo->var:" << p->m_foo->var << "\nEnter anything to delete the element: ";
}
else
{
std::cout << "m_foo was nullptr";
}
}
else
{
std::cout << "Element was invalid";
}
}
std::this_thread::sleep_for(std::chrono::duration(std::chrono::seconds(2)));
}
}
int main()
{
Bar* p_Bar = new Bar;
p_Bar->m_foo = new Foo;
list.emplace_back(p_Bar);
std::thread thread1(Check);
thread1.detach();
std::string t;
std::cin >> t;
if (list[0]->m_foo)
delete list[0]->m_foo;
if (list[0])
delete list[0];
list.clear();
std::cin >> t;
_check = false;
return 0;
}
要检查指针是否被删除,我应该使用NULL
或nullptr
,这实际上意味着0。
但是一旦指针被删除,地址将是这样的 0xFFFFFFFFFFFFFFFF 并且 IDE 将抛出这种异常:
Exception thrown: read access violation.
p->m_foo was 0xFFFFFFFFFFFFFFFF.
如何检查指针的deleted/pointer地址是否有效?
How to check whether the pointer's deleted/pointer's address is valid or not?
无法检查指针是有效还是无效。如果指针有效或为空,则可以检查它是哪一个。如果指针无效,则比较结果将不确定。
除了比较无效指针外,您的程序还有另一个错误:您在一个线程中删除,并在另一个线程中访问指针而不同步操作。同样,您正在访问向量的元素,而它的元素在另一个线程中被删除。程序的行为未定义。
P.S。避免拥有裸指针。
您可以使用 automatic_ptr class 代替 classic in-build 指针。
您可以自己开发,或使用例如。 std::unique_ptr 和 std::shared_ptr。
classes 的原理是,该指针包含在 class 和 class 计数外部链接(指针...)中并将其存储到内部属性中。
在C++的每一本书中都有它的例子。
我是 c++
的新手,我被这个问题困住了。
我将一个结构指针(Bar*)附加到一个向量,该结构有一个指针 class 成员(Foo*)。
struct Bar
{
const int var{ 0 };
Foo* m_foo{ nullptr };
};
std::vector<Bar*> list;
int main()
{
Bar* p_Bar = new Bar;
p_Bar->m_foo = new Foo;
list.emplace_back(p_Bar);
}
我有一个线程检查这些指针的有效性。删除这些指针后,矢量元素应该存在,我应该检查两个指针是否有效。 当其中任何一个无效时,我应该删除该矢量元素(我的意思是检查后)。 这是我的尝试:
#include <iostream>
#include <vector>
#include <thread>
class Foo
{
public:
Foo() {};
const int var{ 5 };
};
struct Bar
{
const int var{ 0 };
Foo* m_foo{ nullptr };
};
std::vector<Bar*> list;
bool _check = true;
void Check()
{
while (_check)
{
for (int c = 0; c < (int)list.size(); c++)
{
Bar* p = list[c];
if (p)
{
if (p->m_foo)
{
std::cout << "m_foo->var:" << p->m_foo->var << "\nEnter anything to delete the element: ";
}
else
{
std::cout << "m_foo was nullptr";
}
}
else
{
std::cout << "Element was invalid";
}
}
std::this_thread::sleep_for(std::chrono::duration(std::chrono::seconds(2)));
}
}
int main()
{
Bar* p_Bar = new Bar;
p_Bar->m_foo = new Foo;
list.emplace_back(p_Bar);
std::thread thread1(Check);
thread1.detach();
std::string t;
std::cin >> t;
if (list[0]->m_foo)
delete list[0]->m_foo;
if (list[0])
delete list[0];
list.clear();
std::cin >> t;
_check = false;
return 0;
}
要检查指针是否被删除,我应该使用NULL
或nullptr
,这实际上意味着0。
但是一旦指针被删除,地址将是这样的 0xFFFFFFFFFFFFFFFF 并且 IDE 将抛出这种异常:
Exception thrown: read access violation.
p->m_foo was 0xFFFFFFFFFFFFFFFF.
如何检查指针的deleted/pointer地址是否有效?
How to check whether the pointer's deleted/pointer's address is valid or not?
无法检查指针是有效还是无效。如果指针有效或为空,则可以检查它是哪一个。如果指针无效,则比较结果将不确定。
除了比较无效指针外,您的程序还有另一个错误:您在一个线程中删除,并在另一个线程中访问指针而不同步操作。同样,您正在访问向量的元素,而它的元素在另一个线程中被删除。程序的行为未定义。
P.S。避免拥有裸指针。
您可以使用 automatic_ptr class 代替 classic in-build 指针。 您可以自己开发,或使用例如。 std::unique_ptr 和 std::shared_ptr。 classes 的原理是,该指针包含在 class 和 class 计数外部链接(指针...)中并将其存储到内部属性中。 在C++的每一本书中都有它的例子。