【发布时间】:2017-06-07 17:16:51
【问题描述】:
我为这样的数组数据结构编写了一个类模板:
#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,分段错误。 0x00007ffad1783f2a in msvcrt!memmove () from C:\WINDOWS\System32\msvcrt.dll
我检查了程序,崩溃直接发生在 CEntry 行中,其中 m_value 被分配给传递的值(在 setSymbol 函数中)。 我在windows上使用eclipse。我在分配之前检查了 m_value 变量,它显示了可疑值,例如字符串长度为 13451671603782742029?会不会是CEntry对象被初始化了,但不是它的成员变量?
我已经尝试过研究,但无法弄清楚这里发生了什么,在此先感谢。
【问题讨论】:
-
调试器是解决此类问题的正确工具。 在询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 edit 您的问题包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
-
我调试了程序 - 请阅读我在下面写的文字!此外,这是我可以重现它的最小示例,原始代码要长得多。
-
避免
malloc。为什么不改用std::array或std::vector呢? -
@πάνταῥεῖ:你似乎高估了调试器告诉没有经验的程序员他们做错了什么的能力。
-
@πάνταῥεῖ:OP 正确地使用了它的调试器,但
std::string的内部并不一定是微不足道的。 OP 实际上错误地使用了它的分配器。
标签: c++ string segmentation-fault