我有类A和B.类B有一个指向类A的指针作为字段,指向列表:
void B::add_elem(char* str) {
A* tmp;
tmp = new A;
tmp->txt = str;
tmp->next = next;
next = tmp;
}
我以这种方式创建此列表的每个元素:
new A
我必须在最后删除列表。默认情况下是否会使用类A的析构函数删除它,因为我已经调用B::~B() {
int i;
A* tmp;
cout<<"del list\n";
if (next) { // at least one elem
tmp = next;
while (tmp->next) {
tmp = tmp->next;
delete next;
cout<<"del elem\n";
next = tmp;
}
delete tmp;
}
}
(但是我让我的析构函数打印消息,没有它们)或者我应该明确地删除它(I&#39我试过,这是编译中的错误)?求助。
lastrow = lastRowOfRange(range("b2").currentregion)
Function lastRowOfRange(rng As Range)
Dim adr
adr = Split(rng.Address, "$")
lastRowOfRange = adr(UBound(adr))
End Function
答案 0 :(得分:0)
使用new
创建的任何指针的生命周期必须由创建者使用匹配的delete
手动管理以释放内存。
这意味着拥有原始指针的每个类都必须处理它的删除。这通常在析构函数中完成。如果您使用的是C ++ 11,则可以使用unique_ptr而不是原始指针来管理自己的生命周期。这将帮助您摆脱许多错误和内存泄漏,但会为您的设计添加一些约束。在大多数情况下,这些约束是你真正想要的。
为了更好地处理C ++中的内存管理问题,您可以查看https://isocpp.org/wiki/faq/freestore-mgmt
答案 1 :(得分:0)
哦,它有效!事实证明,我忘了给某些字段记忆,但在析构函数中我想删除它。这是一个复杂的类:一些静态字段和一个动态:动态大量,其中每个成员都是一个指向列表的指针。 最后,这个析构函数工作:
set::~set() {
int i;
elem* tmp;
for(i=0; i<size; i++) {
if (table[i].next) { // at least one elem
tmp = table[i].next;
while (tmp->next) {
tmp = tmp->next;
delete table[i].next;
table[i].next = tmp;
}
delete tmp;
}
}
delete[] table;
cout<<"del set\n";
}
nirvana@lpt00:~/cpp/new$ ./a.out
new set
new list
new list
new list
new list
new list
new el
new el
del el
del el
del list
del list
del list
del list
del list
del set
谢谢大家!