【发布时间】:2011-05-09 18:14:17
【问题描述】:
我对 C++ 还不是很有经验,所以如果这是基本的东西,请耐心等待。
我有一些类似下面的代码。 L 是一个抽象类(它有许多纯虚函数),而A、B 和C 都是从L 派生的常规类。这些可能有任意数量,而且它们都是不同的。
int main() {
// ...
std::vector<L*> ls(3) ;
ls[0] = new A ;
ls[1] = new B ;
ls[2] = new C ;
int i ;
for (i = 0 ; i < ls.size() ; i++) {
if (ls[i]->h()) {
// ...
}
}
// ...
}
它有效,但确实必须有更好的方法来初始化该向量。对吧?
向量在第一次初始化后不应该改变。但是,我认为我不能将其设为 const,因为各种对象本身可能会在内部发生变化。我在常规数组上选择了一个向量,因为我不想手动跟踪它的长度(这被证明容易出错)。
理想情况下,我想将向量的定义和初始化从main 中提取出来,最好放到一个单独的文件中,然后我可以在#include 中提取。当我尝试编译器抱怨它“在‘=’标记之前需要构造函数、析构函数或类型转换”时。所有A、B 和C 类都有默认构造函数。
另外,我的印象是我必须手动 delete 使用 new 创建的任何内容,但它不会使用 delete 或 delete[] 删除 ls。如果我尝试delete ls;,编译器会抱怨“type ‘class std::vector
以上是安全的还是会导致一些内存问题?
【问题讨论】:
-
A、B、C的析构函数到底是做什么的?
-
我没有给他们一个析构函数,所以我想不管编译器默认提供什么。我应该给他们自定义析构函数吗?
-
关键是,如果析构函数没有做任何特殊的事情(比如写入日志文件或其他东西),你可能根本不用在指针上调用
delete,因为内存无论如何,程序退出时都会被回收。 -
我明白了。但是,我认为为了安全起见删除它们并没有什么坏处?特别是如果我以后要向其中一个或全部添加一个析构函数。
-
不,调用析构函数绝对没有坏处。我只是怀疑跳过确保调用析构函数所必需的箍是否值得额外的复杂性。请注意,简单地将一堆
delete语句放在main函数的底部并不能保证将调用析构函数,因为如果之前抛出异常,控制流可能永远不会到达这些语句。跨度>