无法将C ++类模板中使用的对象的字符串成员变量赋值给

时间:2017-06-07 17:16:52

标签: c++ string segmentation-fault

我为数组数据结构编写了一个类模板,如下所示:

#pragma once
#include <cstdlib>

template<typename T, unsigned int N>
class CArray {
public:
    CArray();
    T& operator [] (unsigned int index);
private:
    T *entries;
};

template<typename T, unsigned int N>
CArray<T, N>::CArray()
{
    entries = (T *)malloc(N*sizeof(T));
}

template<typename T, unsigned int N>
T& CArray<T, N>::operator [] (unsigned int index) {
    if (index >= N) {
        throw ;
    } else {
        return entries[index];
    }
}

我编写了一个存储字符串对象的最小包装类,如下所示:

#pragma once
#include <string>
using namespace std;

class CEntry
{
public:
    CEntry();
    const string & getSymbol() const;
    void setSymbol(string);
protected:
    string m_value;
};

实现:

#include "CEntry.hpp"

CEntry::CEntry() : m_value(""){
}

const string & CEntry::getSymbol() const {
    return  m_value;
}

void CEntry::setSymbol(string value) {
    m_value = value;
}

当我执行以下主要内容时:

#include <iostream>
#include <string>

#include "CEntry.hpp"
#include "CArray.hpp"

int main(int argc, char** argv) {
    CArray<CEntry, 2000> test;
    test[0].setSymbol("asdf");
    cout << test[0].getSymbol();
}

程序因分段错误而崩溃。 线程1收到信号SIGSEGV,分段故障。 msvcrt中的0x00007ffad1783f2a!来自C:\ WINDOWS \ System32 \ msvcrt.dll的memmove()

我检查了程序,崩溃直接发生在CEntry的行中,m_value被赋值给传递的值(在setSymbol函数中)。 我在windows上使用eclipse。我在赋值之前检查了m_value变量,它显示了可疑值,例如13451671603782742029字符串长度?可能是CEntry对象已初始化但不是它的成员变量吗?

我已经尝试过研究,但无法弄清楚这里发生了什么,提前谢谢。

1 个答案:

答案 0 :(得分:3)

您的程序崩溃了,因为您正在访问未构造的string个对象。

使用malloc分配内存时,内存未初始化,并且尚未构建您尝试使用的对象。这是未定义的行为,在这种情况下,导致崩溃。