有没有人知道在LISP中引入点对类型的历史原因是什么,而现有的列表类型涵盖了所有内容?
我也对此感兴趣,因为虚线对经常让我困惑.
以下代码降低了我的信念,即我或多或少地了解C++.为什么valgrind不在这里显示任何memleak?为什么我期待memleaks:
B大于A:它包含一个额外的成员; 所以在分配时应该有类'字段切片.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应该被调用时,我混淆了基类指针删除对象.这里只是课堂复制的内容.感谢大家!
我有以下代码:
#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缓冲问题而没有打印出来?