#define MAX_THREADS 1
class Test {
public:
Test(): m_stop(false), s("Object exists.") {
printf("ctor\n");
m_threads = new pthread_t[MAX_THREADS];
for (int i = 0; i < MAX_THREADS; i++) {
pthread_create(m_threads + i, NULL, worker, this);
pthread_detach(m_threads[i]);
}
}
~Test() {
delete [] m_threads;
m_stop = true;
}
private:
static void* worker(void* arg) {
printf("%Thread running\n");
auto t = (Test*)arg;
// while (!t->m_stop) {
while (1) {
printf("Hello from %d, %p\n", pthread_self(), t);
printf("%s\n", t->s.c_str());
sleep(1);
}
}
private:
pthread_t* m_threads;
bool m_stop;
string s;
};
int main() {
Test* t = new Test;
sleep(5);
delete t;
printf("dtor done\n");
sleep(5);
}
输出结果:
![](https://gitee.com/ara_zzy/PicGo/raw/master/img/20211214210631.png
对象已经被释放,但是线程依然持有指向那个地址的指针,非常恐怖
如果使用m_stop判断:
正常,但是感觉还是有风险。