在返回新实例时,在运算符中创建临时堆变量是否会导致内存泄漏
Does creating temp heap variables in an operator overloads when returning a new instance cause a memory leak?
例如,想象一个+
运算符重载来连接两个字符串;在本例中,两种奶酪的名称。在这里,我使用了在堆上创建的tmp
变量。当方法退出时,这是否会导致内存泄漏?
Class Cheese {
private:
int nameLen; // Length of name
char * name; // C string
public:
Cheese(char * str); // Constructor
int getNameLen(); // Returns length of name
char * getName(); // Returns name
}
}
Cheese Cheese::operator + (const Cheese & rhs) {
char * tmp = new char[nameLen + rhs.getNameLen()];
strcpy(tmp, name);
strcat(tmp, rhs.getName());
return Cheese(tmp); // Is this a problem? Where does tmp get deleted?
}
用法:
Cheese c1("mozzarella");
Cheese c2("provolone");
printf("Cheese Blend: %s", (c1 + c2).getName());
因此,返回值将创建Cheese
的另一个实例。我关心的是在堆上创建的tmp
是否会造成内存泄漏。它从未被删除,由于我将它作为return
语句的一部分,我不知道应该在哪里删除它。
这是合理的担忧吗?我需要这个tmp变量吗?还是我可以聪明一点,根本不使用它?最好的做法是把它放在堆栈上,如下所示吗?最佳做法是什么?
char * tmp[len + rhs.getLen()];
Thx!
return Cheese(tmp); // Is this a problem? Where does tmp get deleted?
如果Cheese
的构造函数复制输入参数,则会出现问题。
当函数返回时,可以使用智能指针删除tmp
使用的内存。
int len = nameLen + rhs.getNameLen() + 1; // Need the +1 for the null terminator
std::unique_ptr<char, std::default_delete<char[]>> tmp(new char[len]);
strcpy(tmp.get(), name);
strcat(tmp.get(), rhs.getName());
return Cheese(tmp.get());
若使用std::string
作为成员变量name
的类型,而不是char*
,就可以消除代码中这些不必要的复杂性。如果这样做,就可以去掉nameLen
成员变量。然后,上述函数可以简化为:
Cheese Cheese::operator + (const Cheese & rhs) {
return Cheese(this->name + rhs.name);
}
相关文章:
- 如何检查变量是否是C++中的地图?
- 如何更好地检查两个 char 变量是否在一组值中?
- 模板变量是否允许在多个翻译单元中并有效合并?
- 如何检查模板类中的变量是否为字符串类型?
- 如何检查 int 变量是否包含合法(非陷阱表示)值?
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- C++11:16 字节原子<>变量是否在 16 字节边界上自动对齐,从而允许CMPXCHG16B指令?
- 程序如何知道静态变量是否需要初始化?
- 检查私有成员变量是否在一定范围内,如果没有调整
- C++ 如何检查 char 变量是否未定义(未初始化)
- 是否可以检查变量是否位于 L1/L2/L3 缓存中
- 初始化命名空间中的变量是否类似于将它们初始化为类成员?
- 如果输入类型与目标类型不同,"cin"变量是否重置为某个默认值?
- 变量是否会自动转换为函数所需的类型作为适当的参数
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 如何对私有变量是否已更改进行单元测试
- 将常量引用成员设置为临时变量是否安全
- 如何检查类中定义的枚举类型变量是否被分配给?
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- "decltype(auto)"变量是否有任何实际用例?