从数组中删除指针
Deleting pointers from an array
我对C++相当陌生,我遇到的这个问题在过去的 2 个小时里一直困扰着我。 我正在尝试做的是创建一个指向我的类 Word 对象的指针数组,因此是一个 2 维数组,这是**wordPtrList
.然后我需要删除数组中某些对象的内存并将其指针设置为 null。我在下面写了一个我试图完成的缩小版本。
int main()
{
char *cArray;
cArray = new char[4];
int i;
for (i = 0; i < 3; i++)
cArray[i] = 'a';
cArray[i + 1] = ' '; //cArray is a null terminated string
Word **wordPtrList;
wordPtrList = new Word* [3];
for (i = 0; i < 3; i++)
{
wordPtrList[i] = new Word(cArray);
}
wordPtrList[1]->del();
delete wordPtrList[1];
wordPtrList[1] = ' ';
return 0;
}
class Word
{
private:
char* ptr_;
int len_;
public:
Word(const char* word)
{
len_ = strlen(word);
ptr_ = new char[len_];
strcpy(ptr_, word);
}
~Word()
{
delete [] ptr_;
ptr_ = 0;
}
void del()
{
delete [] ptr_;
ptr_ = 0;
return;
}
};
但是,当我这样做时,我得到:
在正常块后检测到调试错误堆损坏
这是在Windows 7上的VS 2010中。
所以我要问的是,如何删除对象的内存,以便我可以wordPtrList[1]
设置为 Null?
您将 4 个字节分配给 cArray(这意味着您可以写入字节 0 到 3),然后写入 cArray[4]。 您还可以在 Word 构造函数中分配一个太小的字节。
char *cArray;
cArray = new char[4];
int i;
for (i = 0; i < 3; i++)
cArray[i] = 'a';
cArray[i] = ' '; //cArray is a null terminated string - i is now 3
和
Word(const char* word)
{
len_ = strlen(word);
ptr_ = new char[len_ + 1];
strcpy(ptr_, word);
}
应该做这个伎俩。
看看这段代码:
for (i = 0; i < 3; i++)
cArray[i] = 'a';
cArray[i + 1] = ' '; //cArray is a null terminated string
问题出在使用i+1
作为索引的最后一行,这超出了范围,因为当循环退出时,i
的值已经3
;这意味着当你将cArray
分配为时,i+1
将成为4
不能成为有效索引:
cArray = new char[4]; //taken from your code
解决方案是这样的:
cArray[i] = ' '; //Now, it is correct. Here i is equal to 3
也就是说,使用 i
而不是 i+1
;或者干脆用3
.
在C++中,您可以std::fill
而不是手动循环,如下所示:
std::fill(cArray, cArray + 4, 'a'); //done
最好尽可能避免将char*
与new
一起使用,而更喜欢使用std::string
。
代码中有两个明显的逐个错误(当你离开第一个循环时,变量i
的值是多少?调用strlen
时,你是否记得考虑空终止符所需的空间?)。
另请注意,c 字符串不是"以空结尾",它们是"NUL 终止",带有大写字母,只有一个"L"。 NUL
是 ASCII 控制字符的名称,所有位都设置为零,并以 C++ 表示,并用 ' '
表示。在一个地方,你使用NUL
字符作为空指针,虽然这在技术上是正确的(因为C++语言的设计错误),但最好理解这两个概念是完全不同的。
正如其他人所说,您基本上是在访问数组范围之外的数组索引。
我会选择Nathan Wiebe的解决方案。
将来,当您可以选择执行此操作时,建议使用 std::vector<T>
因为这将允许您将所需的任何类型存储在可动态调整大小的数组中。换句话说,如果你不访问超出向量边界的索引,你可以做这样的事情:
std::vector< char* > str;
for( size_t i = 0; i < str.size(); ++i )
{
str.push_back( 'a pointer to a block of memory consisting of characters' );
}
class Word
{
public:
Word( const char* str )
{
mStrs.push_back( str );
}
~Word( void )
{
for( size_t i = 0; i < mStrs.size(); ++i )
{
if( mStrs[ i ] )
{
delete mStrs[ i ];
mStrs[ i ] = NULL;
}
}
mStrs.clear();
}
private:
void del( size_t index )
{
if( index > mStrs.size() )
{
//error - throw new exception or something
}
delete mStrs[ index ];
}
std::vector< const char* > mStrs;
};
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存