回 帖 发 新 帖 刷新版面

主题:c++ 的delete 语句问题及数组奇怪现象

题目要求:读入一组string类型的数据(例如读入几个单词),将他们存在vector中,创建一个指针数组1,再为vector里每个对象创建一个字符数组2,把vector元素的数据复制到字符数组中,每个字符数组2的为头指针为指针数组1的元素。利用指针数组1输出vector的内容。
问题:1:关于第一个问题,我稍微了解过野指针的现象,但是这里我并没有在一次循环内给q重新赋值,但是为什么仍能输出,没有提示出错?
      2:按道理说,这里已经把每个对象对应的指针q的地址送到指针p那里了,但为什么输出的对象却没有变化?

希望能得到答案,非常感谢!
 
一下是代码:
#include <iostream>
#include <string>
#include <vector>
using std::cout;
using std::endl;
using std::cin;
using std::string;
using std::vector;
int main()
{
    vector<string> ivec;
    string a;
    while (cin>>a)
    {
          ivec.push_back(a);
    }
    string *p[ivec.size()];
    int m=0;
    for (vector<string>::iterator iter=ivec.begin();iter!=ivec.end();++iter,++m)
    {
        string *q=new string [30];
        *q=*iter;
        p[m]=q;
        delete [] q;
        cout<<*p[m]<<" "; //问题1:为什么这里的*p[m]改为*q后仍能输出? 
    }
    cout<<endl;
    // 输出部分 
    for (int i=0;i!=ivec.size();++i)
    {
        cout<<*p[i]<<" ";//问题2:这里的p[i]照理应该输出vector的对象,为什么这里都是输出最后的对象而没有变化? 
    }
    cout<<endl;
    system("Pause");
    return 0;

回复列表 (共3个回复)

沙发

问题1:p 指向第一个
问题2: *q=*iter;
        p[m]=q;    使得p[m]都是指向iter,都是一样的

板凳


我也不知道。但是一般我删除指针时,一般都是
delete []p;
p=NULL;
防止野指针的产生。你删除指针后,没有进行对指针赋空值,指针指向的对象不明确,可能恰好指到原对象了吧,乱猜的。这种情况编译器一般不报错。
第二个问题,不知道了。帮顶。

3 楼

帮顶

我来回复

您尚未登录,请登录后再回复。点此登录或注册