执行完毕后出现段错误——C++动态内存分配问题求助
排查自定义MyString类的动态内存分配问题
刚接触C++动态内存分配就踩坑太正常了——自定义字符串类的内存管理本来就是新手容易栽跟头的地方。你怀疑问题出在buffer_allocate函数里,这个方向很对,不过你贴的代码有点截断(for(int i = 0; i < m_size; i+...没写完),先从现有代码和常见坑点帮你分析下:
首先先把你提供的代码贴出来方便参考:
#include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #include "MyString.h" using namespace std; MyString::MyString() { m_size = 0; buffer_allocate(0); } MyString::MyString(const char * str) { m_size = strlen(str); buffer_allocate(m_size); for(int i = 0; i < m_size; i+...
几个大概率的问题点:
buffer_allocate的内存分配逻辑:
你没贴这个函数的实现,但如果是用malloc或new分配,要注意两个细节:- 分配0字节的情况:
malloc(0)在不同编译器下行为不一致,有的返回NULL,有的返回可释放的非NULL指针;C++里new char[0]合法,但后续操作不能越界访问。 - 字符串结束符的空间:C风格字符串必须以
\0结尾,如果你只分配了m_size字节(也就是字符串的长度),那拷贝完字符后根本没地方放\0,后续用cout输出、调用strlen都会触发未定义行为(比如乱码、程序崩溃)。正确的做法应该是分配m_size + 1字节的内存。
- 分配0字节的情况:
- 未完成的字符串拷贝循环:
你写的for循环明显没写完,要确保循环能完整遍历str的每个字符,把它们拷贝到你的缓冲区里,最后记得手动加上\0(如果你的类设计依赖这个结束符的话)。 - 缺失的"三法则"实现:
如果你的MyString类没有正确实现析构函数、拷贝构造函数和赋值运算符,那大概率会出现内存泄漏或者双重释放的问题。比如析构函数里有没有用delete[](如果用new分配)或者free(如果用malloc)释放buffer_allocate分配的内存?
下一步建议:
- 把
buffer_allocate的完整代码、构造函数的剩余部分,还有析构函数的代码贴出来,这样能精准定位问题。 - 先测试最基础的场景:比如用默认构造函数创建对象,看会不会崩溃;用
MyString test("hello")创建对象后尝试输出,观察有没有异常。 - 检查内存分配时是否给
\0留了空间,拷贝字符串后是否手动添加了结束符。
内容的提问来源于stack exchange,提问作者Ben Nordin
相关产品推荐
相关产品推荐

