我为数组数据结构编写了一个类模板,如下所示:
#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对象已初始化但不是它的成员变量吗?
我已经尝试过研究,但无法弄清楚这里发生了什么,提前谢谢。
答案 0 :(得分:3)
您的程序崩溃了,因为您正在访问未构造的string
个对象。
使用malloc
分配内存时,内存未初始化,并且尚未构建您尝试使用的对象。这是未定义的行为,在这种情况下,导致崩溃。