小编ban*_*nov的帖子

在LISP中引入点对的原因是什么?

有没有人知道在LISP中引入点对类型的历史原因是什么,而现有的列表类型涵盖了所有内容?

我也对此感兴趣,因为虚线对经常让我困惑.

lisp list

8
推荐指数
2
解决办法
3004
查看次数

为什么在分配时,下面的C++中没有memleaks?

以下代码降低了我的信念,即我或多或少地了解C++.为什么valgrind不在这里显示任何memleak?为什么我期待memleaks:

  1. B大于A:它包含一个额外的成员; 所以在分配时应该有类'字段切片.
  2. ~A()没有虚拟dtor.所以,当我们调用delete a~A()应该叫和B中分配的内存会丢失.

但我收到dtors的调用顺序是:~A(),~B(),~A().为什么?!

struct A {
  ~A()
  {
      std::cerr << "~A" << std::endl;
  }
};

struct B : A {
  int* data;

  B() : data(new int[20]) {}

  ~B()
  {
    std::cerr << "~B" << std::endl;
    delete [] data;
  }
};
Run Code Online (Sandbox Code Playgroud)

main():

A* a = new A;
B* b = new B;
*a = *b;

delete a;
delete b;
Run Code Online (Sandbox Code Playgroud)

UPD:对我感到羞耻!当虚拟dtor应该被调用时,我混淆了基类指针删除对象.这里只是课堂复制的内容.感谢大家!

c++ memory-leaks

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

为什么在主要内部没有捕获异常时没有调用析构函数?

我有以下代码:

#include <iostream>
#include <vector>
#include <tr1/memory>

struct FooError {};

struct Foo
{
    ~Foo() { std::cerr << "~Foo() executed" << std::endl; }
    explicit Foo(unsigned int index) { if (5 == index) throw FooError(index); };
};


int main() {
    typedef std::tr1::shared_ptr<Foo> FooPtr;
    std::vector<FooPtr> foos;
    for (unsigned int index = 0; index < 20; ++index)
    {
        try
        {
            foos.push_back(FooPtr(new Foo(index)));
        }
        catch (const FooError&)
        {
            std::cerr << "FooError caught" << std::endl;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

~Foo()当有try{} catch{}块时我看到一组被执行.如果没有异常处理程序,则不会打印任何内容.是否意味着在处理异常时会调用堆栈分配对象的析构函数?或者因为std :: cerr缓冲问题而没有打印出来?

c++ destructor exception stack-unwinding

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

标签 统计

c++ ×2

destructor ×1

exception ×1

lisp ×1

list ×1

memory-leaks ×1

stack-unwinding ×1