相关疑难解决方法(0)

可以在其范围之外访问局部变量的内存吗?

我有以下代码.

#include <iostream>

int * foo()
{
    int a = 5;
    return &a;
}

int main()
{
    int* p = foo();
    std::cout << *p;
    *p = 8;
    std::cout << *p;
}
Run Code Online (Sandbox Code Playgroud)

而代码只是运行而没有运行时异常!

输出是 58

怎么会这样?本地变量的内存不能在其功能之外无法访问吗?

c++ memory-management local-variables dangling-pointer

990
推荐指数
19
解决办法
26万
查看次数

是否可以从另一个线程观察部分构造的对象?

我经常听说在.NET 2.0内存模型中,写入始终使用释放围栏.这是真的?这是否意味着即使没有明确的内存屏障或锁定,也不可能在不同于创建它的线程上观察部分构造的对象(仅考虑引用类型)?我显然排除了构造函数泄漏this引用的情况.

例如,假设我们有不可变的引用类型:

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用以下代码观察除"John 20"和"Jack 21"之外的任何输出,例如"null 20"或"Jack 0"?

// We could make this volatile to freshen the read, but I don't want
// to complicate the core of the question.
private Person person;

private void Thread1()
{
    while (true)
    {
        var personCopy = person; …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading memory-model thread-safety

27
推荐指数
1
解决办法
1125
查看次数

垃圾收集前是否清除了内存?

与同事进行了这次讨论.当诸如c#或java垃圾之类的语言收集诸如字符串之类的对象,将它们返回到堆中时,它们是否也清除了这个内存块,例如用0或1覆盖?

我的假设是块按原样返回,除非使用诸如带有finalize重载的securestring之类的类来阻止块.

c# java garbage-collection

5
推荐指数
1
解决办法
448
查看次数