c++新建和删除
c++ new and delete
我分配了内存,但当我调用析构函数时,它会给我一个分段错误。这是代码。我用正确的方法释放内存了吗?
class plan {
char *symbol;
gro *grow;
public:
plan (int, char[] ); //constructor
~plan ( ); //destructor
};
plan::plan (int num_of_sm, char sm[]){
try {
symbol = new char [strlen(sm) + 1];
}
catch (std::bad_alloc) {
symbol = NULL;
}
if (symbol != NULL) {
if (sm == NULL) {
strcpy (symbol, "");
}
else {
strcpy (symbol, sm);
}
}
gro = new grow [num_of_sm];
}
plan::~plan( ){
delete [ ] symbol;
delete [ ] gro;
}
使用std::string
并完成它。
万一它不明显,那就解决问题了。
但是,为了避免一些类似的问题,也为了更多地了解所涉及的问题,请查阅3的规则,或者现在在C++11中所知的5的规则。
内存问题可能非常棘手,因为程序并不总是立即崩溃。例如,如果您删除同一个指针两次,程序可能会继续运行,直到稍后删除时崩溃。如果你在Linux上运行,我建议你运行valgrind(假设安装了它,只需键入valgrind,然后输入正常命令。例如valgrind myprog arg1 arg2
)
在任何情况下,不要认为问题一定是程序崩溃的地方。请尝试检查任何其他删除/释放语句是否存在问题。你确定num_of_sm是一个合理的值吗?
当我调用析构函数时,它会给我一个分段错误。
你是指的测试代码吗
int main()
{
plan a_plan(2, "hello");
a_plan.~plan();
}
如果是这样的话,我认为问题是你删除了两次指针。第一次在计划中::~plan(),第二次在离开main()时。所以,不要调用plan::~plan()。
你应该遵循三条规则(或五条规则),也就是说:如果定义了析构函数,则应该同时定义复制构造函数和赋值运算符。
相关文章:
- 创建模板类型而不新建/删除
- C++ 在请求特定字节的新建后删除
- 为什么非放置"新建"和"删除"内置于语言中,而不仅仅是常规函数?
- 来自C#的mingw DLL:为什么我必须覆盖新建/删除?
- C++ - 定义自定义新建和删除运算符时make_shared
- 使用安全零内存新建/删除时出现问题
- 奇怪的内存泄漏由C++中的新建/删除
- CRT 检测到应用程序在堆缓冲区(新建/删除)类结束后写入内存
- 无法覆盖C++中纯抽象类中的运算符删除/新建
- 编译器或标准C++库 - 新建和删除
- 混合运算符和表达式新建/删除
- 新建和删除的经验法则
- 运算符新建和删除重载作用域
- 使用运算符重载(新建/删除)实现单例的优缺点
- 忽略全局覆盖的新建/删除
- C++内存泄漏新建并删除
- 基本的新建/删除操作员日志记录
- C++自定义全局新建/删除覆盖系统库
- 为什么使用XXXX_new和XXXX_free而不是新建和删除
- 新建和删除如何工作以及它们的存储位置