c++ - 指向类创建错误核心转储的指针

标签 c++ class templates pointers segmentation-fault

我正在尝试创建一个模板类。看起来没问题,但是当我尝试创建指向 myclass 对象的指针时,发生核心转储错误。

#include <iostream>
#include <stdlib.h>

template <typename T>
class vec {
private:
    T* m_pnt;
    int m_dim;

public:
    vec();
    vec(int);
    ~vec();

    void prnt();
    void reduce(int);
    void null();

    void set(int, T);
    void print();
};

template <typename T>
vec<T>::vec() {
    m_dim = 100;
    m_pnt = (T*)calloc(100, sizeof(T));
    std::cout << "building without par" << std::endl;
}

template <typename T>
vec<T>::vec(int n) {
    m_dim = n;
    m_pnt = (T*)calloc(m_dim, sizeof(T));
    std::cout << "building" << std::endl;
}

template <typename T>
vec<T>::~vec() {
    free(m_pnt);
    std::cout << "killed" << std::endl;
}

template <typename T>
void vec<T>::reduce(int dim) {
    std::cout << "reduce" << std::endl;
    if (dim <= m_dim) {
        m_dim = dim;
        T* p = (T*)calloc(m_dim, sizeof(T));
        for (int i = 0; i != m_dim; i++)
            *(p + i) = *(m_pnt + i);

        free(m_pnt);

        m_pnt = p;
    } else {
        std::cout << "error: rowvector not valid dimension" << std::endl;
        throw;
    }
}

template <typename T>
void vec<T>::set(int idx, T val) {
    if (idx >= 1 && idx <= m_dim)
        *(m_pnt + idx - 1) = val;
    else {
        std::cout << "error: rowvector not valid index" << std::endl;
        throw;
    }
}

template <typename T>
void vec<T>::prnt() {
    for (int i = 0; i != m_dim; i++)
        std::cout << i + 1 << "\t" << m_pnt + i << "\t" << *(m_pnt + i)
                  << std::endl;
}

template <typename T>
void vec<T>::null() {
    for (int i = 1; i <= m_dim; i++)
        *(m_pnt + i - 1) = T(0);
}

int main() {
    vec<int>* d;
    std::cout << "d: " << d << std::endl;
    d->prnt();

    return 0;
}

编译没有报错,但是最终输出是这样的

    d: 0
    segmentation fault (core dumped)

最佳答案

你从未分配你的指针:

vec<int>* d = new vec<int>;

您当前的代码:

vec<int>* d;

只是定义了一个变量d持有指向 vec<int> 的指针目的。但它指向任何地方。要使其指向某物,您必须构建一个 vec<int>在内存中使用 new vec<int>

关于c++ - 指向类创建错误核心转储的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25186605/

相关文章:

c++ - 如何将 Boost.Phoenix 中的一系列语句与 std::transform 一起使用?

c++ - 使用 Intel MKL 的 3D 卷积

c++ - 使用 In Order 遍历成员函数时出现异常(堆栈溢出)问题

java - 抽象类或接口(interface)

objective-c - 覆盖父类(super class)的指定初始化程序

ruby - Rails 5 渲染部分并传递数据

html - 如何将长 HTML 拆分为 "functions"

c++ - allegro5 (C++) 中的另一幅图像

javascript - jQuery 将类添加到一个元素而不是所有具有相同类的元素

python - 从 python 中的 mako Template.render() 对象中获取变量?