2017-04-19 98 views
-1

最近我删除了一个对象并引发了一个异常,我已经缩小到使用strcpy()。为了测试这个,我做了一个简单的测试类,它基本上只使用strcpy()和瞧,这是一个例外。无法删除使用strcpy的对象()

#pragma once 
class TestClass 
{ 
public: 
    TestClass(char []); 
    ~TestClass(); 

    char teststring[]; 
}; 

它的构造是这样的:

TestClass::TestClass(char incstring[]) 
{ 
    strcpy(teststring, incstring); 
    printf(teststring); 
} 

如果我运行下面的代码:

int main(){ 
    TestClass* test = new TestClass("Cheezit"); 

    delete test; 
} 

我得到一个抛出的异常!什么是STRCPY()?!?!?!?!

注意:控制台窗口打印“Cheezit”。

+4

这不是一个有效的类定义。你的代码无效C++;你非常不幸的是要使用一个破碎的编译器(或者以破碎的方式使用编译器),它可以让你摆脱这种困境。 –

+0

请编辑您的问题以包含[mcve] – Slava

+0

@Slava:可能是。这看起来像一个C灵活的数组成员,在C++中很奇怪。 –

回答

1
char teststring[]; 

作为数组成员在标准C++中是不允许的。

您的编译器似乎将它视为C的一个功能的灵活数组成员,作为C++的扩展。但是,正确使用灵活阵列成员需要谨慎分配,这是您尚未完成的任务。所以即使假设有这样的扩展,你的程序仍然有未定义的行为。

2

您的代码无效C++。在C++中,所有非静态类数据成员必须具有完整类型,并且char[]不是完整类型。您需要指定数组的大小,然后相应地初始化数组:

class TestClass 
{ 
public: 
    TestClass(char a[]) : teststring{} { std::strncpy(teststring, a, 2); } 
    char teststring[3]; 
}; 

不能推断出任何构造数组的大小,因为构造函数是类的一部分,并且类是不完整的,直到数组大小已经被指定。

+0

[Demo](https://ideone.com/XUvRca) –

+0

使用C++ 17,他可以使它成为一个模板类,并且其大小被推断为:http ://en.cppreference.com/w/cpp/language/class_template_deduction –

+0

@JerryJeremiah:好的,但那是完全不同的......(你不会推导出构造函数参数*值*!) –