遍历指针后删除[]时出现C++错误
C++ error on delete[] after iterating through pointer
环境:Windows 7 pro x64,Microsoft Visual Studio 2015 Enterprise,版本14.0.25424.00更新3
int testFunction()
{
std::string _orig = "[188 80% (1/2)O:152]";
std::string _orig2 = "[999 99% (1/1)O:999]";
char *orig = NULL;
char *orig2 = NULL;
orig = new char[_orig.length() + 1];
strcpy(orig, _orig.c_str());
orig2 = new char[_orig2.length() + 1];
strcpy(orig2, _orig2.c_str());
*orig++;
*orig2++;
int a = atoi(orig);
int b = atoi(orig2);
delete[] orig;
delete[] orig2;
return 0;
}
运行上面的代码会因"_CrtIsValidHeapPointer(块)"错误而崩溃。
如果我不迭代(*orig++和*orig2++),那么没有问题。
所以我的问题是,我如何迭代指针,然后当我完成了我需要对它们做的事情时,正确地删除它们?
您没有删除分配的指针!
必须对new
返回的原始内存地址调用delete
。既然你做了orig++
,你就不能把指向的地址delete
!
迭代可以使用索引来完成,并使用数组订阅来取消引用:
orig[i] = 'a';
这与这样做相同:
*(orig+i) = 'a';
或者,您可以获取指向相同数据的另一个指针,并修改此指针。
char* pOrig = orig;
++pOrig;
你为什么写
*orig++; // why dereferencing?
只有++
本身可以进行迭代。
避免使用原始指针。你的代码可以更简单:
std::string orig = "[188 80% (1/2)O:152]";
std::string orig2 = "[999 99% (1/1)O:999]";
int a = atoi(orig.c_str() + 1);
int b = atoi(orig2.c_str() + 1);
您的错误是试图删除移位的指针而不是原始指针。因此,堆管理器会得到错误的分配块信息,这些信息通常放在分配的指针之前,从而导致堆损坏。
我如何迭代指针,然后当我完成了我需要对它们做的事情时,正确地删除它们?
创建指针的副本:
char* orig = new char[size];
char* i = orig;
*i++ = 'a';
delete orig;
一个可能更常见的习惯用法是取消引用一个临时的:
for(int i = 0; i < size - 1; i++)
orig[i] = 'a';
我很想[使用
std::string
],但我需要使用atoi(),它在std::string 上不起作用
你错了。atoi
与std::string
配合得很好。只需像使用strcpy
一样使用std::string::c_str()
即可。绝对没有理由用new
来分配内存块。
int testFunction()
{
std::string _orig = "[188 80% (1/2)O:152]";
int a = 0;
for (std::string::iterator it = _orig.begin(); it != _orig.end(); ++it)
{
if (isdigit((char)*it))
a = (atoi(it._Ptr));
}
return 0;
}
我明白了。谢谢所有帮助我得出这个结论的人。事实上,使用std::string是最好的方法。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'