C++ C++;向动态数组添加字符串时访问冲突写入位置
我正在实现一个动态数组。我的默认阵列容量是10。当我尝试添加超过10个随机字符串时,我得到一个错误“访问冲突写入位置。这个->***\u Myproxy**是0xFDFD。”并且我被抛出到xutility文件的第239行 但是,当我将数组设置为包含int或chars时,它就可以正常工作了。当我添加少于10个字符串时也是如此,所以我不知道问题出在哪里。也许我在以一种扭曲的方式释放记忆 这是我的主要函数,也是Arr类的构造函数、析构函数和void add函数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
#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)这可能是错误。然而,在过去,在类似的情况下,一旦指出明显的错误,稍晚一点你会得到一个回答说“哎呀,我做了那个更改,但代码仍然被破坏”.那是因为代码中还有一些东西甚至没有显示出来,也被破坏了,我浪费了时间键入答案。因此,出于这个原因,我的个人政策是,如果问题没有答案,只发表少量评论。我必须能够剪切/粘贴、复制错误、应用修复程序并重新编译,现在就证明它是正确的是的。然后我发布一个答案。