C++ 在调试器模式下工作。在可执行模式下崩溃

C++ 在调试器模式下工作。在可执行模式下崩溃,c++,visual-studio-2013,C++,Visual Studio 2013,代码是在VS community 2013中编写的。程序在调试器模式下运行良好。但在执行过程中崩溃了。请告诉我可能有什么问题。 样本测试用例: 10 aaa bbb ccc aaa 程序在第三输入行崩溃,有时在第四输入行崩溃 #include<iostream> #include<string.h> #include<string> using namespace std; class registeration { public: char* nam

代码是在VS community 2013中编写的。程序在调试器模式下运行良好。但在执行过程中崩溃了。请告诉我可能有什么问题。 样本测试用例: 10 aaa bbb ccc aaa

程序在第三输入行崩溃,有时在第四输入行崩溃

#include<iostream>
#include<string.h>
#include<string>
using namespace std;
class registeration
{
public:
    char* name;
    int count;
    registeration *next;

    registeration()
    {
        name = new char(20);
        count = 0;
        next = NULL;
    }
};
int main()
{
    int n;
    cin >> n;
    char* str = new char(n);
    registeration *regStart = new registeration();

    while (n--)
    {
        cin >> str;
        if (regStart->next == NULL)
        {
            registeration *reg = new registeration();
            regStart->next = reg;
            reg->count++;
            //strcpy(reg->name, str);
            strcpy_s(reg->name, 20, str);
        }
        else
        {
            registeration *reg = new registeration();
            reg = regStart->next;
            while (reg->next != NULL && strcmp(str, reg->name))
            {
                //registeration *reg1 = new registeration();
                reg = reg->next;
            }
            if (!strcmp(str, reg->name))
                reg->count++;
            else
            {
                registeration *reg1 = new registeration();
                strcpy_s(reg1->name, 20, str);
                reg1->count++;
                reg->next = reg1;

            }
        }
    }
    registeration *reg = new registeration();
    reg = regStart->next;
    while (reg != NULL)
    {
        if (reg->count > 1)
            cout << reg->name << endl;
        reg = reg->next;
    }
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
类注册
{
公众:
字符*名称;
整数计数;
注册*下一步;
注册()
{
名称=新字符(20);
计数=0;
next=NULL;
}
};
int main()
{
int n;
cin>>n;
char*str=新字符(n);
registration*regStart=newregistration();
而(n--)
{
cin>>str;
如果(regStart->next==NULL)
{
注册*reg=新注册();
regStart->next=reg;
reg->count++;
//strcpy(注册->名称,str);
strcpy_s(注册->姓名,20,str);
}
其他的
{
注册*reg=新注册();
reg=regStart->next;
while(reg->next!=NULL&&strcmp(str,reg->name))
{
//注册操作*reg1=新注册操作();
reg=reg->next;
}
如果(!strcmp(str,reg->name))
reg->count++;
其他的
{
注册操作*reg1=新注册操作();
strcpy_s(reg1->name,20,str);
reg1->count++;
reg->next=reg1;
}
}
}
注册*reg=新注册();
reg=regStart->next;
while(reg!=NULL)
{
如果(注册->计数>1)
下一步不能命名;
}
返回0;
}

一个明显的错误出现在以下几行中:

name = new char(20);
char* str = new char(n);
它们分配一个初始化为给定值的字符。相反,您打算分配一个字符数组,具体操作如下:

name = new char[20];
char* str = new char[n];
(使用括号而不是括号。)

< >最好使用标准的C++实用程序来管理内存,比如“代码> STD::String < /Cord>字符串和<代码> STD::vector < /C> >或<代码> STD::容器的< < /代码>。< /P> 编辑:此代码与您的代码具有相同的功能,更好:

#include <iostream>
#include <string>
#include <map>
using namespace std;

int main()
{
    int n;
    cin >> n;

    map<string, int> m;
    for(int i = 0; i < n; ++i)
    {
        string s;
        cin >> s;
        m[s]++;
    }

    for(const auto &pr : m)
        if(pr.second > 1)
            cout << pr.first << '\n';
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
int n;
cin>>n;
地图m;
对于(int i=0;i>s;
m[s]++;
}
用于(const auto&pr:m)
如果(公共秒>1)

你的代码会像地狱一样泄漏内存吗?还有,为什么不使用
std::string
?当然是UB。“UB”是“在调试中工作,在发布中崩溃”的缩写。