我需要一个在结构中声明的变量,以便稍后用值初始化。这基本上是因为它的初始化取决于结构的另一个成员,它只在某些函数完成后才有值。
这听起来有点奇怪,所以我会展示我的代码:
# tables.py
class MyItemsTable(tables.Table):
itemid = tables.LinkColumn('myapp.views.edit_item',
args=[A('pk')],orderable=False)
class Meta:
model = models.MyItems
attrs = {"class": "paleblue"}
# views.py
def myitems_list(request):
myitems = models.MyItems.objects.all()
table = tables.MyItemsTable(myitems)
RequestConfig(request).configure(table)
return render(request, 'myapp/mylist.html', {'table':table,'myitems':myitems})
def edit_item(request, pk):
selecteditem = get_object_or_404(models.MyItems, pk=pk)
return render(request, 'myapp/edit_item.html', {'selecteditem': selecteditem})
# models.py
class MyItems(models.Model):
itemid = models.IntegerField(primary_key=True)
itemfullname = models.TextField('Full Name',blank=True, null=True)
目前此代码抛出此错误:
struct frame
{
Mat thresholded;
vector<vector<Point> > contrs;
vector<Moments> momts;
};
frame obj_detect(frame img)
{
// Get contours from image
findContours(img.thresholded, img.contrs, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
// Initialise moments vector big enough for all contours' moments
img.moments(img.contrs.size());
...
return img;
}
int main()
{
frame frame1;
frame1 = obj_detect(frame1);
...
}
我应该如何初始化矩矢量数组,以便它有足够的空间用于所有轮廓?
答案 0 :(得分:2)
你想要做的事情没有任何错误或奇怪。这是一个初始化函数的例子(或者称为类的构造函数)。
还不完全清楚的是struct1
是否是要初始化的结构,或者它是否是用于返回新结构的输入(因为您的函数确实将其返回类型定义为my_struct
也是如此)。在任何一种情况下,通常建议通过引用而不是值或返回值来传递结构。
您可以尝试这样的事情:
void my_function(const my_struct& input_struct, my_struct& output_struct)
{
...
output_struct.size = ...;
output_struct.my_array = new char[output_struct.size];
...
}
当然,如果您真的使用的是C ++,那么您应该质疑为什么使用结构来表示似乎是字符串的内容?
一旦你以这种方式分配内存,重要的是你也要释放内存以避免内存泄漏。可以使用delete
取消分配单个对象,但应使用delete []
取消分配数组,例如:
delete [] some_struct.my_array;
此外,在解除分配它们之后将指针设置为null被认为是一种好习惯,以避免引用过时的内存段。这可以这样做:
some_struct.my_array = nullptr;
最后,管理这一切都变得有点乏味,特别是如果对象的生命周期和所有权更复杂的话。为了解决这个问题,标准库有unique_ptr
和shared_ptr
个对象,当对象不再被使用时会自动解除分配。
我认为详细了解各自的差异和用途是不合理的,因为这里和其他地方有无数资源。
答案 1 :(得分:-3)
你必须使用malloc()
char* struct1.my_array = new char[struct1.size];
编辑: 实际上你可以使用malloc或new。在这种情况下 - 无所谓。如果您更喜欢malloc,则必须使用free()释放内存,否则必须使用new / delete。通常new / delete在创建对象时很有用,当你处理结构和原始类型时会坚持使用malloc。
New / Delete运算符通常调用构造函数/析构函数,它们比malloc / free稍慢。那么为什么你必须支付(甚至一点点)性能成本呢?
答案 2 :(得分:-3)
对我来说这是一个非常简单的问题
my_struct my_function(my_struct struct1)
{
...
struct1.my_array = malloc(struct1.size); // Initialise the array
...
}