首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板类复制构造函数中的SIGSEGV错误

模板类复制构造函数中的SIGSEGV错误
EN

Stack Overflow用户
提问于 2022-06-04 11:29:44
回答 1查看 53关注 0票数 -1

我正在尝试用模板类和复制构造函数测试/调试一个简单的c++代码。我用两个构造函数定义了一个向量类(用户定义不是STL),一个用于初始化向量元素,另一个用于从数组中赋值。首先我调用初始化构造函数,代码运行良好,但是当我用浮点数数组元素调用构造函数时,第一个赋值语句就会碰到SIGSEGV错误,我检查了调试器中的所有值和地址,没有找到任何提示。我给出了下面的代码,我给出了下面的调用顺序和错误的行细节,从主向量()调用,没有问题,然后调用v1=inputf1;然后调用复制构造函数向量(t1* t2),在循环中的第一个赋值stmt,即ti=t2i,代码会击中SIGSEGV错误;请帮助理解,因为代码很小,所以您可以尝试执行并让我知道-Thanks。

代码语言:javascript
复制
#include <stdio.h>
#include <iostream>

using namespace std;

const int size = 4;

template <class T1>

class vector {
    
    T1* t;
    
public:
    
    vector() {
        
        t = new T1[size];
        
        for(int i=0;i<size;i++)
            t[i] =0;
        
    }


    vector(T1* t2) {
                
        for(int i=0;i<size;i++)
            t[i]=t2[i];//SIGSEGV error at this stmt//
        
        }
    
        
    T1 operator * (vector &va) {
        
        T1 sum=0;
        
        for(int i=0;i<size;i++)
            sum += this->t[i]*va.t[i];
            
        return sum;
                
    }
    
};

int main(int argc, char **argv)
{
    
    int ip;
    float ipf;
    
    float inputf1[4] = {1.2,2.3,3.4,4.5};
    vector<float> v1;
    v1=inputf1;
    float inputf2[4] = {5.6,6.7,7.8,8.9};
    vector<float> v3;
    v3=inputf2;
    
    int inputi1[4] = {1,2,3,4};
    vector<int> v2;
    v2=inputi1;
    
    int inputi2[4] = {5,6,7,8};
    vector<int> v4;
    v4=inputi2;
    
    ip = v2*v4;
    ipf = v1*v3;
    
    cout<<"inner product of int vectors = "<< ip <<endl;
    
    cout<<"inner product of float vectors = "<< ipf <<endl;
    
     
        
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-04 11:56:12

问题不是在t中初始化vector(T1 *t2)

在这种情况下,您可以像这样继承构造函数:

代码语言:javascript
复制
vector(T1 *t2):vector() {

    for (int i = 0; i < size; i++)
        t[i] = t2[i]; 
}

但是vector(T1 *t2)在哪里呢?在每个作业中,因为没有operator参加T*

代码语言:javascript
复制
v1=inputf1

被重写为

代码语言:javascript
复制
v1.operator=(vector<float>(inputf1));

因为编译器发现这个隐式转换可以工作。当然,operator=vector(T* vals)都没有正确的实现,所以它会在某个地方失败。

即使您修复了构造函数,您的代码也有错误,因为您没有正确地实现五条规则

备注

复制构造函数vector(T1* t2)

这不是一个复制构造函数,而是一个普通的构造函数。vector(const vector<T1>&)将是复制者。

考虑使用一个参数explicit创建构造函数,这将禁止隐式转换。

如果忘记,至少直接初始化每个成员作为备份。T* t=nullptr;,这将使代码具有决定性的分段错误。有总比没有强。

我检查了调试器中的所有值和地址,没有找到任何提示。

我觉得你用的是什么调试器?因为常见的错误会中断分段故障,给出调用堆栈,并允许对所有变量进行检查。您将看到t没有在那里被初始化。

您的代码非常不安全,using namespace std,您已经与std::size发生了冲突,如果您使用#include <vector>,将会有更多的代码。它是如何为您编译的?对我来说不是。

我建议您获得一个合适的编译器、调试器、启用警告-Wall -Wextra -Werror和使用杀菌剂,它们非常快速地跟踪错误。例如,地址消毒剂显示:

代码语言:javascript
复制
==1==ERROR: AddressSanitizer: SEGV on unknown address 0x7fbd726014d0 (pc 0x000000401d0c bp 0x7ffe0c253230 sp 0x7ffe0c253210 T0)
==1==The signal is caused by a WRITE memory access.
    #0 0x401d0c in vector<float>::vector(float*) /app/example.cpp:28
    #1 0x401615 in main /app/example.cpp:57
    #2 0x7fbd726490b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x240b2)
    #3 0x40114d in _start (/app/output.s+0x40114d)

从而使错误变得清晰。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72499366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档