在C 中调用delete []内部破坏者
Calling delete[] inside destructor in c++
我在以下代码中有疑问,击曲线内有一个destructor delete line[]
,我只想知道该删除是否有堆叠量,这可能是递归的结果致电击曲线。
class Line {
public:
char *line;
Line(const char *s = 0) {
if (s) {
line = new char[strlen(s)+1];
strcpy(line, s);
} else {
line = 0;
}
}
~Line() {
delete[] line; //----------> how this delete will work?
line = 0;
}
Line &operator=(const Line &other) {
std::cout <<"go"<< endl;
delete[] line; //----------> purpose of using this delete??
line = new char[other.len()+1];
strcpy(line, other.line);
return *this;
}
int operator<=(const Line &other) {
int cmp = strcmp(line, other.line);
return cmp <= 0;
}
int len() const {
return strlen(line);
}
};
int main() {
Line array[] = {Line("abc"), Line("def"),
Line("xyz")};
Line tmp;
}
超载分配运算符中的删除是在分配新内存之前清洁内存(我已经在某个地方读取了它,如果我错了,请纠正我),但是此删除是否会调用destructor?
请解释
no,它不会。
此删除语句将删除字符数组。线路的破坏对象仅在销毁线对象时才调用。但是,这里不是这样。
变量线和对象/类线是不同的。
线变量在行类中是一个成员变量。因此,这两个名称看起来相同,但完全不同。
delete[] line;
对构造函数和分配运算符中的new char[strlen(s)+1];
语句配对。请注意,如果将line
设置为nullptr
,则delete[] line;
是一个NO-OP,这是else
分支分配所做的,尽管它使用0
代替nullptr
。
可以确保攻击依次不被递归地称为。只是使用破坏者来释放任何分配的内存。
但是,使用std::string line;
作为类成员变量,,甚至整个类本身 都将变得更加容易。您的代码中有一些微妙的错误 - 自我分配是其中之一,而复制构造函数丢失了。让C 标准库为您服务。简而言之,您可以写
int main() {
std::string array[] = {"abc", "def", "xyz"};
std::string tmp;
}
delete[]
的参数是 char*
,即没有destructor称为destructor(也没有对破坏者的递归调用)。
如果您有这样的破坏者:
~Line() { delete this; } // DONT DO THIS !!! (also for other reasons it is not OK at all)
这将试图递归地调用自己,但您的代码看起来不错。
在分配操作员
中line = new char[other.len()+1];
将分配新内存,并将指针(指向此内存)分配给line
。这将导致您不再有旧内存的处理方法,并且要避免泄漏,您需要在之前将其删除。
c 默认情况下,请注意delete [] char*,因此您无需做任何事情。
- 将函数类成员映射到类本身内部
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 卷曲bracers内部结构的声明
- 从函数角度看ID到文件路径的内部与外部映射
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在pugixml中获取节点的内部XML
- 使用C链接在函数内部创建C++模板
- 指针没有更新它在void函数内部指向的值
- 方法内部但循环仍得到预期的不合格id错误C++
- C++:具有内部链接的正向声明常量
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- libcurl 和 DNS ttl 中的内部连接管理
- 如何修改 lambda 内部字符串的向量
- 如果我将嵌套映射作为多重映射的值,如何将值插入内部映射?
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 在C 中调用delete []内部破坏者