【问题标题】:C++ deprecated conversion from string constant to 'char*' []C++ 弃用从字符串常量到 'char*' [] 的转换
【发布时间】:2016-05-18 20:14:18
【问题描述】:

每当我尝试运行我的代码时,我都会收到这些错误行。似乎有时它会使程序崩溃。这是可能的还是其他原因导致崩溃? 错误代码出现在以下几行:

Buffer<char*> s(20,"s.txt","rw");    //20 long char*
   for(unsigned int i=0;i<24;i++){   //it overwrites the size of s after default 20
    s[i]="hey";         //error here: "deprecated conversion from string constant to 'char*'"   

类是这样的(删除了不重要的部分):

template<class T>
class Buffer:public File_ptr
{

    unsigned int siz;
    T *data;


public:

    ///constructor(size,filename,openmode)
    Buffer(unsigned int s,const char* n, const char* m):File_ptr(n,m),siz(s)
    {
        data= new T[siz];
       /* for(unsigned int i=0; i<siz; ++i)
        {
            data[i]=0;
        }; */
    };

    ///destructor
    ~Buffer()
    {
        delete[] data;
    }

    ///operator[]
    T& operator[](unsigned int i)
    {
        if(i>siz-1)
        {
            unsigned int newsize=siz*2;
            T* tmp=new T[newsize];
            for(unsigned int j = 0; j < siz; j++)
            {
                tmp[j] = data[j];
            }
            siz=newsize;
            delete[] data;
            data=tmp;
        };
        return data[i];

};     

知道为什么我会收到错误消息吗? 提前致谢!

【问题讨论】:

  • 为什么不简单地将std::vector&lt;T&gt; 用作Buffer 的成员?那么如果缓冲区不够大,就让Buffer::operator[] 直接调用vector::resize()
  • 很遗憾,我们禁止在这个作业中使用 STL。
  • 好吧,你 1) 不能安全地复制缓冲区,2) 你不能在使用 const 缓冲区的函数中调用 operator []。我把它留给你的老师(或你自己)来解决这些问题。此外,在这个 C++ 时代甚至不使用std::string 简直太离谱了。

标签: c++ string class crash


【解决方案1】:

"hey" 是字符串文字,因此编译器将其存储在可执行文件的不同部分中,该部分可能与所有其他字符串一起存储在写保护内存中。因此,在 C++ 中,在指针上下文中,它的计算结果为 const char*

解决办法是声明

Buffer<const char*> s(20,"s.txt","rw"); 


template<class T>
class Buffer
{

    unsigned int siz;
    T *data;


public:

    ///constructor(size,filename,openmode)
    Buffer(unsigned int s,const char* n, const char* m):siz(s)
    {
        data= new T[siz];
    }

    ///destructor
    ~Buffer()
    {
        delete[] data;
    }

    ///operator[]
    T& operator[](unsigned int i)
    {
        if(i>siz-1)
        {
            unsigned int newsize=siz*2;
            T* tmp=new T[newsize];
            for(unsigned int j = 0; j < siz; j++)
            {
                tmp[j] = data[j];
            }
            siz=newsize;
            delete[] data;
            data=tmp;
        }
        return data[i];
    }
};     

int main() {
    Buffer<char*> s(20,"s.txt","rw");    //20 long char*
    for(unsigned int i=0;i<24;i++){   //it overwrites the size of s after default 20
        s[i]="hey";
    }
}

现场演示:http://ideone.com/Dgdcui

【讨论】:

    【解决方案2】:

    您正在尝试将字符串文字存储在 char* 变量中 - 表明它是可写的。

    字符串文字通常存储在应用程序二进制文件的只读数据段中(请参阅this question

    来自C++ FAQ

    ...它变成了一个未命名的静态字符数组,而这个未命名的数组可能存储在只读存储器中,因此不一定可以修改

    尝试写入只读数据段中的内存位置将导致您的程序终止 - 从而导致崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2013-05-21
      • 1970-01-01
      • 2010-12-04
      • 2018-09-02
      相关资源
      最近更新 更多