【问题标题】:String member variable of an object used in C++ Class template cannot be assigned to不能将 C++ 类模板中使用的对象的字符串成员变量分配给
【发布时间】: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::arraystd::vector 呢?
  • @πάνταῥεῖ:你似乎高估了调试器告诉没有经验的程序员他们做错了什么的能力。
  • @πάνταῥεῖ:OP 正确地使用了它的调试器,但 std::string 的内部并不一定是微不足道的。 OP 实际上错误地使用了它的分配器。

标签: c++ string segmentation-fault


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这导致了这个问题。
  • 用新的 T[N] 替换 malloc;修好了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多