C++ 无法删除使用strcpy()的对象

C++ 无法删除使用strcpy()的对象,c++,exception,memory,strcpy,C++,Exception,Memory,Strcpy,最近,我删除了一个对象,并抛出了一个异常,我已经将其缩小到strcpy()的使用范围。为了测试这一点,我制作了一个简单的测试类,它(基本上)只使用strcpy()和voila,一个异常 #pragma once class TestClass { public: TestClass(char []); ~TestClass(); char teststring[]; }; 它的构造函数如下所示: TestClass::TestClass(char incstring[

最近,我删除了一个对象,并抛出了一个异常,我已经将其缩小到strcpy()的使用范围。为了测试这一点,我制作了一个简单的测试类,它(基本上)只使用strcpy()和voila,一个异常

#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”

标准C++中不允许数组成员。


<>你的编译器看起来是把它当作一个灵活的数组成员,一个C的特性,作为C++的扩展。但是,正确使用灵活的数组成员需要注意分配,而您还没有这样做。因此,假设有这样的扩展,程序仍然有未定义的行为。

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

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

无法从任何构造函数推断数组大小,因为构造函数是类的一部分,并且在指定数组大小之前,类是不完整的。

这不是有效的类定义。您的代码无效C++;你很不幸使用了一个坏掉的编译器(或者以坏掉的方式使用了一个编译器),这样你就可以侥幸逃脱。请编辑你的问题,使其包含一个@Slava:它被称为“”。您只能在动态分配上下文中使用它。该代码不是MCVE,因为它缺少所需的
#include
s和
~TestClass
的定义。不使用C++17在gcc上编译,他可以将其作为模板类并推断其大小:@JerryJeremiah:当然,但这是完全不同的。。。(而且您不会推断构造函数参数值!)@KerrekSB谢谢,我已经将teststring更改为字符指针(char*),并且在TestClass的构造函数中,我在strcpy()前面有一行内容:“teststring=new char[sizeof(incstring)];”。这会使teststring指向一个大小为incstring的数组吗?这记忆安全吗?@Danielobaum:这些都不是。你说的每一句话都有漏洞。更新你的问题,我可以指出它们。或者在这个网站上搜索“数组大小”和“sizeof”。我做了一些研究,认为我已经取得了一些进展。我在上贴了另一个问题。如果你们中有人能帮助我,我将不胜感激
class TestClass
{
public:
    TestClass(char a[]) : teststring{} { std::strncpy(teststring, a, 2); }
    char teststring[3];
};