我有一个用 C++ 编写的程序,它执行以下操作:获取一个未排序的整数数组,并按升序将其分成子数组。例如。我的数组是 1,2,3,-2,4 所以输出将是: 1,2,3//子数组1 -2,4//子数组2
我要求的方法是分配指针数组,该数组中的每个单元格将指向包含一个系列的子数组(也是动态分配的)。另外,我不允许更改“主要”功能
现在,我有了使用运算符重载打印子数组的“打印”方法。
我检查并发现 print 方法工作正常,但在这段代码中:
cout << "\ns3: \n";
print(s3);
s3 = s1;
cout << "\ns3 again: \n";
print(s3);
print(s3) 打印正常,但是在赋值运算符之后再次调用 print(s3) 时,我得到了垃圾输出。经过一些调试后,我认为它与析构函数有关。
如果有人能指出并确定我的问题并提供解决方案,我将非常感激。 当然我会给出源代码
更新
我想更好地解释一下:在每次调用“print”之后,当我追溯时,在“print”之前执行的第一件事是复制构造函数。当我在复制构造函数中设置断点时,我看到函数签名(复制构造函数)中的指针“src”指向正确的位置(数组中的第一个元素),但是在 assignmet s3=s1 之后当我print(s3) 再次复制构造函数中的指针是垃圾
**
这里是代码:
// HW4.cpp : Defines the entry point for the console application.
//
#include <iostream>
using namespace std;
//global declerations and indexes//
typedef long int * LONG_INT_PTR;
//class
class SeriesArray
{
//members declerations
private:
LONG_INT_PTR *stable;
int *count_arr; //help array that indicate how many serieses made from the array and how many element in each series
int count_size; // help counter
int size;
public:
SeriesArray::SeriesArray(LONG_INT_PTR arr, int n );
SeriesArray::SeriesArray(const SeriesArray& src );
SeriesArray::~SeriesArray();
long int SeriesArray::get_entry(int i,int j) const;
SeriesArray& SeriesArray::operator=(const SeriesArray& src);
friend ostream& operator<<(ostream& stream, const SeriesArray& src);//global - not member
};
//members implementation
//default constructor
SeriesArray::SeriesArray(LONG_INT_PTR arr, int n )
{
size=n;
int j=0;
int s=0;
count_size=0;
count_arr=new int[size];
for (int i=0;i<size;i++)
{
if (arr[i]<arr[i+1])
count_size++;
else
{
count_size++;
count_arr[j]=count_size;
j++;
count_size=0;
}
}
size=j;
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
stable[i]=new long int[count_arr[i]];
for (int k=0;k<count_arr[i];k++)
{
stable[i][k]=arr[s];
s++;
}
}
}
//copy constructor
SeriesArray::SeriesArray(const SeriesArray& src )
{
size=src.size;
count_arr=new int[size];
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
count_arr[i]=src.count_arr[i];
stable[i]=new long int[count_arr[i]];
}
memcpy(this->stable,src.stable,src.size*sizeof(long int));
}
//destructor
SeriesArray::~SeriesArray()
{
for (int i=0;i<size;++i)
delete[] stable[i];
delete[] this->count_arr;
count_size=0;
}
//member
long int SeriesArray::get_entry(int i,int j) const
{
if (i<this->count_size&&this->stable[i][j]!=NULL)
return (this->stable[i][j]);
else return NULL;
}
//overload = operator
SeriesArray& SeriesArray::operator=(const SeriesArray& src)
{
if (this==&src)
return *this;
if (stable!=NULL)
delete[] stable;
if (count_arr!=NULL)
delete[] count_arr;
//for (int i=0;i<size;i++)
// delete[] stable[i];
size=src.size;
count_arr=new int[src.size];
memcpy(count_arr,src.count_arr,src.size*sizeof(int));
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
// count_arr[i]=rhs.count_arr[i];
stable[i]=new long int[src.count_arr[i]];
}
memcpy(stable,src.stable,src.size*sizeof(long int));
return *this;
}
//***************************************************************************************************************************************************//
//global//
//overload operator <<
ostream& operator<<(ostream& stream,const SeriesArray& src)
{
for (int i=0;i<src.size;i++)
{
for (int j=0;j<src.count_arr[i];j++)
{
stream << " " << src.stable[i][j] << " " ;
}
stream << "\n\n\n" ;
}
return stream;
}
//print
void print(SeriesArray src)
{
cout << src;
cout << "\n";
} // print
//main
int main()
{
long int arr1[20] = {23, 91, -71, -63, 22, 55, 51, 73, 17, -19,
-65, 44, 95, 66, 82, 85, 97, 30, 54, -34};
long int arr2[10] = {0, 1, -7, -6, 2, 5, 6, 7, 1, -1};
int count[20], i, j, n =20, sno;
long int *parr[20];
SeriesArray s1(arr1, 20);
SeriesArray s2(arr2, 10);
SeriesArray s3(arr2, 10);
cout << "\narr1:\n";
for(i=0; i < 20; i++)
cout << " " << arr1[i] << " ";
cout << "\n";
cout << "\n\ntable:\n";
print(s1);
cout << "\narr2\n";
for(i=0; i < 10; i++)
cout << " " << arr2[i] << " ";
cout << "\n";
cout << "\n\ntable:\n";
print(s2);
cout << "\ns3: \n";
print(s3);
s3 = s1;
cout << "\ns3 again: \n";
print(s3);
cout << "\ns1 again: \n";
print(s1);
cin>>i;
return 0;
} // main
最佳答案
问题出在你的赋值运算符上,这几乎是正确的,但几乎正确还不够好
for (int i=0;i<size;i++)
{
// count_arr[i]=rhs.count_arr[i];
stable[i]=new long int[src.count_arr[i]];
}
memcpy(stable,src.stable,src.size*sizeof(long int));
我想你的意思是
for (int i = 0; i < size; i++)
{
stable[i] = new long int[src.count_arr[i]];
memcpy(stable[i], src.stable[i], src.count_arr[i]*sizeof(long int));
}
你的复制构造函数有同样的错误
SeriesArray::SeriesArray(const SeriesArray& src )
{
size=src.size;
count_arr=new int[size];
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
count_arr[i]=src.count_arr[i];
stable[i]=new long int[count_arr[i]];
}
memcpy(this->stable,src.stable,src.size*sizeof(long int));
}
应该是
SeriesArray::SeriesArray(const SeriesArray& src )
{
size=src.size;
count_arr=new int[size];
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
count_arr[i]=src.count_arr[i];
stable[i]=new long int[count_arr[i]];
memcpy(stable[i], src.stable[i], src.count_arr[i]*sizeof(long int));
}
}
您对二维数组的第一次尝试对我来说是不错的努力。
关于C++析构函数删除共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19068204/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序