Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;向动态数组添加字符串时访问冲突写入位置_C++_String_Templates_Dynamic Arrays - Fatal编程技术网

C++ C++;向动态数组添加字符串时访问冲突写入位置

C++ C++;向动态数组添加字符串时访问冲突写入位置,c++,string,templates,dynamic-arrays,C++,String,Templates,Dynamic Arrays,我正在实现一个动态数组。我的默认阵列容量是10。当我尝试添加超过10个随机字符串时,我得到一个错误“访问冲突写入位置。这个->***\u Myproxy**是0xFDFD。”并且我被抛出到xutility文件的第239行 但是,当我将数组设置为包含int或chars时,它就可以正常工作了。当我添加少于10个字符串时也是如此,所以我不知道问题出在哪里。也许我在以一种扭曲的方式释放记忆 这是我的主要函数,也是Arr类的构造函数、析构函数和void add函数 #include "pch.h" #in

我正在实现一个动态数组。我的默认阵列容量是10。当我尝试添加超过10个随机字符串时,我得到一个错误“访问冲突写入位置。这个->***\u Myproxy**是0xFDFD。”并且我被抛出到xutility文件的第239行

但是,当我将数组设置为包含int或chars时,它就可以正常工作了。当我添加少于10个字符串时也是如此,所以我不知道问题出在哪里。也许我在以一种扭曲的方式释放记忆

这是我的主要函数,也是Arr类的构造函数、析构函数和void add函数

#include "pch.h"
#include <iostream>
#include <string>
#include <time.h>
using namespace std;

template < typename T >
class Arr
{
    T * data;
    int capacity, len;
public:
    Arr()
    {
        capacity = 10;
        len = 0;
        data = new T[ capacity ];
    }
    ~Arr()
    {
        delete[] data;
    }
    void add( T value )
    {
        if( capacity <= len ) //powiekszenie jesli nie ma miejsca
        {
            capacity = 2 * capacity;
            T * temp = new T[ capacity ];
            for( int i = 0; i <= len; i++ )
            {
                //temp[i] = data[i];
                temp[ i ] = move( data[ i ] );
            }
            delete[] data;
            data = temp;
        }
        data[ len++ ] = value;
    }
    const T retVal( const int index )
    {
        if( index >= len )
        {
            cout << "Nie ma elementu o takim indeksie, zwracam wartosc el.     
        [0]: ";
        return this->data[ 0 ];
    }
    else
         return this->data[ index ];

    }
    void change( int index, T new_data )
    {
        if( index > len )
        {
            cout << "Nie ma takiego elementu" << endl;
            return;
        }
        data[ index ] = new_data;
    }
    void clean()
    {
        if( len == 0 )
        {
            cout << "Tablica pusta!" << endl;
            return;
        }
        len = len - 1;
        for( int i = len; i >= 1; --i )
        {
            data[ i ].~T();
            len--;
        }
    }
    void getData()
    {
        cout << endl << "Akt. pojemnosc tablicy: " << capacity << endl;
        cout << "Liczba el. w tablicy: " << len << endl;
    }
    void delLast()
    {
        data[ len-- ].~T();
    }
    void printArr()
    {
        for( int i = 0; i < len; i++ )
        {
            cout << data[ i ] << " ";
        }
        //cout << "Koniec" << endl;
    }
};
string randomString( int length )
{
    string rs;
    static const char chars[] = 
  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    int size = sizeof( chars );
    for( int i = 0; i < length; i++ )
    {
        rs = rs + chars[ rand() %( size - 1 ) ];
    }
    return rs;
}
int main()
{
Arr < string > * tab = new Arr < string >();
const int order = 7;
const int n = pow( 10, order );
clock_t start = clock();
double max_time_per_element = 0.0;
srand( time( 0 ) );
for( int i = 0; i < n; i++ )
{
    string el = randomString( 3 );
    clock_t start2 = clock();
    tab->add( el );
    clock_t stop2 = clock();
    double time_per_element =( stop2 - start2 ) / CLOCKS_PER_SEC; // obliczenie czasu pojedynczej operacji dodawania
    if( time_per_element > max_time_per_element )
    {
        time_per_element = max_time_per_element;
        cout << max_time_per_element << endl;
    }
}
clock_t stop = clock();
double general_time =( stop - start ) / CLOCKS_PER_SEC;
tab->getData();
cout << "Czas calej operacji to: " << general_time << endl;
tab->printArr();
tab->clean(); // czyszczenie tablicy wraz z uwalnianiem pamieci danych
delete tab;
return 0;
}
#包括“pch.h”
#包括
#包括
#包括
使用名称空间std;
模板
类Arr
{
T*数据;
整数容量,len;
公众:
Arr()
{
容量=10;
len=0;
数据=新T[容量];
}
~Arr()
{
删除[]数据;
}
无效添加(T值)
{
if(容量数据[索引];
}
无效更改(整数索引,T新数据)
{
如果(索引>len)
{

无法添加函数的第一行将溢出。请重试(len-1)。如果capacity==10且len==10,它仍将尝试添加一项。只有在出现严重错误no后,下一次迭代才会增长,
If
语句似乎是正确的。缓冲区溢出和未定义的行为在其他地方。缓冲区溢出似乎很明显,但是,显示的代码中存在明显的打字错误和截断t表示所显示的代码已被编辑。编辑可能还隐藏了其他问题,因此,在所显示的代码得到修复以满足a的所有要求之前,给出答案(至少对我来说)为时过早。“我只是添加了我认为错误所在的部分”。这本身就是错误的。相反,您应该添加代码满足所有要求所必需的所有内容,任何人都可以简单地剪切/粘贴、编译、运行和复制您的错误。现在,如果您显示的内容是剪切/粘贴的,它甚至无法编译。有关更多信息,请参阅。可能是从0->len开始的循环uld为0->(len-1)这可能是错误。然而,在过去,在类似的情况下,一旦指出明显的错误,稍晚一点你会得到一个回答说“哎呀,我做了那个更改,但代码仍然被破坏”.那是因为代码中还有一些东西甚至没有显示出来,也被破坏了,我浪费了时间键入答案。因此,出于这个原因,我的个人政策是,如果问题没有答案,只发表少量评论。我必须能够剪切/粘贴、复制错误、应用修复程序并重新编译,现在就证明它是正确的是的。然后我发布了一个答案。Add函数的第一行将溢出。Try(len-1)。如果capacity==10且len==10,它仍将尝试添加一项。只有在出现严重错误no后,下一次迭代才会增长,
If
语句似乎是正确的。缓冲区溢出和未定义的行为在其他地方。缓冲区溢出似乎很明显,但是,显示的代码中存在明显的打字错误和截断t表示所显示的代码已被编辑。编辑可能还隐藏了其他问题,因此,在所显示的代码得到修复以满足a的所有要求之前,给出答案(至少对我来说)为时过早。“我只是添加了我认为错误所在的部分”。这本身就是错误的。相反,您应该添加代码满足所有要求所必需的所有内容,任何人都可以简单地剪切/粘贴、编译、运行和复制您的错误。现在,如果您显示的内容是剪切/粘贴的,它甚至无法编译。有关更多信息,请参阅。可能是从0->len开始的循环uld为0->(len-1)这可能是错误。然而,在过去,在类似的情况下,一旦指出明显的错误,稍晚一点你会得到一个回答说“哎呀,我做了那个更改,但代码仍然被破坏”.那是因为代码中还有一些东西甚至没有显示出来,也被破坏了,我浪费了时间键入答案。因此,出于这个原因,我的个人政策是,如果问题没有答案,只发表少量评论。我必须能够剪切/粘贴、复制错误、应用修复程序并重新编译,现在就证明它是正确的是的。然后我发布一个答案。