小编Art*_*kel的帖子

检测何时删除"新"项目

考虑这个程序:

int main()
{
    struct test
    {
        test() { cout << "Hello\n"; }
        ~test() { cout << "Goodbye\n"; }

        void Speak() { cout << "I say!\n"; }
    };

    test* MyTest = new test;
    delete MyTest;

    MyTest->Speak();

    system("pause");
}
Run Code Online (Sandbox Code Playgroud)

我原本以为发生了崩溃,但发生了这种情况:

你好
再见,
我说!

我猜这是因为当内存被标记为已解除分配时,它不会被物理擦除,并且由于代码直接引用它,因此仍然可以在那里找到对象,完全完好无损.在调用之前进行的分配Speak()越多,崩溃的可能性就越大.

无论是什么原因,这对我的实际线程代码来说都是一个问题.鉴于上述情况,我如何可靠地判断另一个线程是否删除了当前想要访问的对象?

c++ multithreading delete-operator

4
推荐指数
1
解决办法
1471
查看次数

如何释放对象中的Python列表?

我有一个包含列表的Python类,我append()重视它.

如果我删除此类的对象然后在同一脚本中创建第二个对象,则第二个对象的列表与删除时的第一个对象的列表相同.

例如:

class myObj:
    a = []
    b = False

o = myObj()
o.a.append("I'm still here!")
o.b = True

del o
import gc
gc.collect() # just to be safe
o = myObj()

print(o.a) # ["I'm still here!"]
print(o.b) # False
Run Code Online (Sandbox Code Playgroud)

一种方法来清空列表:

while len(o.a):
    o.a.pop()
Run Code Online (Sandbox Code Playgroud)

但那太荒谬了,更不用说慢了.为什么它在垃圾收集后仍然在内存中,更重要的是为什么它不会在类进入时被覆盖?正确处理所有非列表成员变量.append(),extend()并且insert()都导致相同的结果 - 我应该使用另一种方法吗?

这是我的完整测试脚本.请注意,如果我尝试直接删除成员列表,Python会给出一个AttributeError,即使我可以从中读取它.

python list

2
推荐指数
1
解决办法
464
查看次数

标签 统计

c++ ×1

delete-operator ×1

list ×1

multithreading ×1

python ×1