我正在尝试测试/调试一个简单的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)
使错误清除。
标题>