假设这个类定义正在工作
TStringListNF = class (TStringList)
procedure TestContenu (verif : Boolean);
destructor DestroyList;
destructor DestroyListFree;
end;
并且这个类的类体也在工作。
destructor TStringListNF.DestroyList;
{//Verified 27 june 98}
var
i : Integer;
tempItem : TObject;
begin
for i:= 0 to Count-1 do
这个问题听起来可能有点奇怪,但我从来没有完全理解为什么我们需要有两种不同的语法来删除C++中的动态分配内存?
例如,
int *p = new int[10];
delete[] p; // why not just delete p;?
在普通的老C中,您只需使用free函数来释放分配给指针的内存,而不管分配的元素数量如何。当然,C++要复杂一些,因为它允许类类型调用它们的析构函数等等。但是,我认为使用单一语法删除C++中动态分配的内存没有任何障碍。
有什么根本原因决定使用两个版本,delete和delete[]?
更重要的是,如果您使用delete而不是delete[],大多数编译器甚至都
我基本上是在剽窃何时不使用虚拟析构函数?。出色的答案提醒我们,C++是pay only for what you use。
然而,“标准”有几千页长。The d-tor of a class containg at least one virtual method is implicitly virtual.不会加载太多。
为什么我们需要保持这样做的认知负担,教新手去做,有时忘记,从而制造可怕的bug?
我希望这个问题有一个客观的答案-语言规范已经讨论了一段时间了。
我有一个使用托管C++类的C#项目。此托管C++类包装了非托管C++代码。
我有像这样的代码块;
if (true)
{
ManagedFoo foo = new ManagedFoo();
}
//GC.Collect(); // I also tried with this one but result is same
我已经将一个简单的输出字符串放到了class的析构函数中。
如果我从visual studio运行程序,则不会调用foo析构函数。但是如果我通过双击它来运行程序(它是一个控制台应用程序),析构函数会立即被调用
我正在开发一个c++程序,它本质上只是执行一个lua脚本。然而,在lua脚本中构造类,这些类已经从我的c++程序导出到lua脚本。
我的main() c++函数只是在做了一些准备之后才调用...
luabind::call_function<void>(m_L, "main");
现在我的lua脚本看起来像这样
local function test()
local c = C()
end
function main()
for i=1,2 do
log(i)
test()
end
end
我在C的析构函数中
public ref class ScriptEditor : public Form
{
public:
typedef map<UInt32, ScriptEditor^> AlMap;
static AlMap AllocationMap;
Form^ EditorForm;
RichTextBox^
下面我已经发布了我试图用来为二进制搜索树创建解构函数的代码。如果我在删除节点之前消除了将父节点链接到NULL的尝试,那么代码将完美运行(它不会永远运行,并且会正确地删除节点)。然而,据我所知,指针现在指向垃圾数据,而不是NULL。我该如何解决这个问题,或者我尝试解决这个问题时出了什么问题?(我得到的错误是“无法读取内存”)。
int BinarySearchTree::postOrderTreeDelete(PhoneInfo * x)
{
static int counter = 0;
if (x == NULL)
{
r
当我尝试编译以下代码时:
class A {
public:
A();
~A();
};
class B : A {
private:
using A::A;
using A::~A;
};
我得到以下编译器错误消息:
error: 'A::~A' names destructor
为什么会这样呢?
我想这样做的更大的原因是能够使用模板来创建一个容器,理论上可以通过容器< container >(它也定义了Node类)实例化来存储任何类型,但希望通过创建一个名为C_Node的容器的派生版本来减少用户的困惑,它拥有除了Node类之外的
我有一个简单的程序不编译
#include <future>
class Foo
{
public:
~Foo();
std::future<int> f;
};
Foo getFoo()
{
return Foo();
}
int main()
{
Foo b = getFoo();
}
我想这是有道理的。Foo不可复制,因为future不可复制。
In function 'Foo getFoo()':
13:16: error: use of deleted function 'Foo::Foo(con
自从我上了关于C#类的第一堂课后,我了解到不仅我不能显式地调用类的Finalize()方法(它由垃圾收集器调用),而且我甚至不允许在我的自定义类中实现它。
让我有点困惑的是,在中,就像这样-
By default, the Object.Finalize method does nothing. If you want the garbage collector to perform cleanup operations on your object before it reclaims the object's memory, you must override this metho
正如在中提到的,简单地第二次调用析构函数已经是未定义的行为12.4/14(3.8)。
例如:
class Class {
public:
~Class() {}
};
// somewhere in code:
{
Class* object = new Class();
object->~Class();
delete object; // UB because at this point the destructor call is attempted again
}
在这个例子中,类的设计方式使得析构函数可以被多次调用--不会发生双重删除这样的事情。
以下是这个问题的后续:
完整的示例使用多个文件,因此为了这个问题,我将在这里减少它。完整的工作示例在这里:,而完整的非工作示例在这里:。
较短的例子是:
#include <memory>
struct A;
struct B {
~B();
std::unique_ptr<A> p = nullptr;
};
哪个
In file included from <source>:1:
In file included from /opt/compiler-explorer/gcc-11.2.0/lib/gcc/x86_64-linux-
此代码是否会产生已定义的行为?
class A {
int x;
};
class B {
short y;
};
class C {
double z;
};
class D : public A, public B, public C {
float bouncy;
};
void deleteB(B *b) {
delete b;
}
void is_it_defined() {
D *d = new D;
deleteB(d);
B *b = new D; // Is this any different?