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



我正在尝试测试/调试一个简单的c++代码与模板类和复制构造函数。我定义了一个向量类(用户定义的不是STL),有2个构造函数,一个用于初始化向量元素,另一个用于从数组中赋值。首先,我调用初始化构造函数,代码运行良好,但是当我用浮点数组元素调用构造函数时,第一个赋值语句遇到SIGSEGV错误,我已经检查了调试器中的所有值和地址,没有发现提示。我给出下面的代码,我给出下面的调用顺序和行错误的详细信息,从main vector()被调用,没有问题,然后v1=inputf1;调用,然后调用复制构造函数向量(T1* t2),代码在循环中的第一次赋值stmt中遇到SIGSEGV错误,即t[i]=t2[i];,请帮助理解,因为代码很小,你也可以尝试执行,让我知道-谢谢。

#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;
}

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

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

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

但是vector(T1 *t2)在哪里被称为?在每个赋值中,因为没有operator占用T*

v1=inputf1

被重写为

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和使用消毒程序,他们真的是快速跟踪错误。地址消毒显示,例如:

==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)

使错误清除。

最新更新